如何合规配置Azure App Service连接Azure MySQL灵活服务器
解决Azure App Service连接MySQL Flexible Server的DNS解析问题
针对你遇到的SequelizeHostNotFoundError: getaddrinfo ENOTFOUND错误,以下是生产环境合规的解决方案,避免直接使用IP地址:
1. 验证FQDN正确性与DNS解析能力
- 确认环境变量
HOST中的FQDN完全匹配Azure门户里MySQL Flexible Server的服务器名称,格式应为<server-name>.mysql.database.azure.com,检查是否存在拼写错误、多余空格或大小写错误(DNS不区分大小写,但建议与门户显示一致)。 - 登录App Service的Kudu控制台(路径:
https://<app-service-name>.scm.azurewebsites.net/),执行命令nslookup <your-mysql-fqdn>,查看是否能正常解析出IP地址:- 如果解析失败,说明App Service所在环境无法解析该FQDN,需检查Azure内部DNS或网络配置;
- 如果解析成功,说明问题出在应用层或连接配置。
2. 配置MySQL Flexible Server的网络访问规则
- 添加App Service出站IP到防火墙:在Azure门户的MySQL Flexible Server→网络→防火墙规则中,添加App Service的所有出站IP地址(可在App Service→属性中查看),这是生产环境最安全的方式,避免宽泛的“允许Azure服务访问”。
- VNet集成(推荐生产环境):将App Service与MySQL Flexible Server部署到同一VNet,或通过VNet peering连接。配置VNet集成后,App Service可通过内部DNS直接解析MySQL的FQDN,同时避免公共网络暴露,提升安全性。
- 确认**“允许Azure服务访问”**选项(如果启用):若暂时无法配置VNet或具体IP,可开启此选项,但生产环境建议仅作为临时方案,后续替换为更严格的规则。
3. 优化Node.js与Sequelize连接配置
- 强制IPv4优先解析:部分环境对IPv6支持不佳,可在Sequelize初始化前添加以下代码,强制DNS优先返回IPv4地址:
const dns = require('dns'); dns.setDefaultResultOrder('ipv4first'); - 配置连接重试机制:在Sequelize配置中添加重试参数,应对临时DNS解析波动:
const sequelize = new Sequelize( process.env.DATABASE, process.env.USER, process.env.MySQLPASSWORD, { host: process.env.HOST, dialect: process.env.dialect, pool: { max: 5, min: 0, acquire: 30000, idle: 10000 }, retry: { match: [/getaddrinfo ENOTFOUND/], // 匹配DNS错误 max: 3 // 重试3次 } } );
4. 检查App Service网络环境
- 若App Service配置了自定义DNS,确保该DNS服务器能正确解析Azure MySQL的FQDN,否则切换回Azure默认DNS。
- 确认App Service未配置出站代理,或代理服务器已正确配置DNS解析能力。
内容的提问来源于stack exchange,提问作者Toms_Hd3z
相关产品推荐
相关产品推荐

