部署在Azure VM的Nest.js应用无法连接CleverCloud远程数据库
问题分析与解决方法
核心问题拆解
当前报错Error: Access denied for user 'root'@'4.227.196.53' (using password: YES)结合本地能正常连接的情况,主要排查方向集中在IP权限限制、环境变量加载异常、数据库用户授权这几个点。
1. CleverCloud数据库IP白名单未放行Azure虚拟机IP
报错中的4.227.196.53是Azure虚拟机的公网IP,CleverCloud远程数据库默认会限制IP访问范围:
- 登录CleverCloud控制台,找到对应数据库实例;
- 在「安全」或「访问控制」板块,将Azure虚拟机的公网IP添加到白名单列表;
- 保存设置后等待1-2分钟,重新启动应用尝试连接。
2. .env文件未正确加载
本地能正常读取.env,但Azure上可能存在路径、权限或加载时机问题:
- 指定.env绝对路径:修改
ConfigModule配置,明确指定.env文件位置避免路径歧义:ConfigModule.forRoot({ isGlobal: true, envFilePath: join(process.cwd(), '.env'), // 强制使用项目根目录的.env }) - 检查文件权限:在Azure虚拟机上执行
ls -l .env,确保Node进程拥有读取权限,若权限不足可执行chmod 644 .env调整; - 提前加载环境变量:在
main.ts最顶部添加代码,强制在应用初始化前加载.env:require('dotenv').config(); // TypeScript环境也可使用import 'dotenv/config'
3. 数据库用户未授权AzureIP访问
CleverCloud的MySQL用户默认可能仅允许从本地IP访问,需手动授权:
- 登录CleverCloud数据库的终端(或通过本地连接执行SQL):
-- 授权root用户从Azure虚拟机IP访问指定数据库 GRANT ALL PRIVILEGES ON `your_database_name`.* TO 'root'@'4.227.196.53' IDENTIFIED BY 'your_database_password'; FLUSH PRIVILEGES; - 若需要临时测试,可授权从任意IP访问(生产环境不推荐):
GRANT ALL PRIVILEGES ON `your_database_name`.* TO 'root'@'%' IDENTIFIED BY 'your_database_password'; FLUSH PRIVILEGES;
4. Azure虚拟机网络限制
检查Azure虚拟机的网络安全组(NSG)是否允许出站访问3306端口(MySQL默认端口):
- 登录Azure门户,找到对应虚拟机的NSG;
- 确认出站规则中允许目标端口3306的流量;
- 若未配置,添加一条允许所有IP访问3306端口的出站规则(或仅允许CleverCloud数据库的IP)。
内容的提问来源于stack exchange,提问作者Sefirot Hunter
相关产品推荐
相关产品推荐

