Node应用部署于SERVER1无法连接SERVER2上的MySQL,求排查方向
我来帮你梳理下剩下可能的排查方向,毕竟远程数据库连接问题有时候藏得挺深的:
检查SERVER2的MySQL绑定地址配置:默认情况下MySQL可能只绑定了
127.0.0.1(本地回环地址),这样即使开了端口也只能本地访问。可以查看MySQL配置文件(通常是/etc/mysql/mysql.conf.d/mysqld.cnf或者/etc/my.cnf)里的bind-address参数,改成0.0.0.0(允许所有IP访问)或者指定SERVER1的IP,改完后重启MySQL服务:sudo systemctl restart mysql。排查SERVER1到SERVER2的网络连通性:在SERVER1上用
telnet SERVER2_IP 3306或者nc -zv SERVER2_IP 3306命令测试端口是否能打通。如果这一步失败,说明网络层面有问题,比如:- 服务器所在的云服务商的安全组/防火墙规则(比如AWS Security Groups、阿里云安全组),可能没放行3306端口的入站请求,这时候光服务器上的UFW放行没用,得去云控制台配置。
- 中间的路由或者网关设备拦截了流量,比如公司内网的防火墙规则。
检查DNS解析问题:如果你的Node应用里用的是域名连接SERVER2,先在SERVER1上ping这个域名,看是否能解析到正确的SERVER2 IP。如果解析错了,那肯定连不上,可以换成直接用IP地址测试,排除DNS的锅。
Node.js环境的网络限制:有些Node.js运行环境或者容器(比如Docker)可能有自己的网络隔离规则,比如如果你的Node应用跑在Docker容器里,容器的网络模式是否能访问到SERVER2?或者容器的防火墙规则是否限制了出站流量?
MySQL连接参数的细节问题:
- 确认连接字符串里的端口号是否正确,有时候可能不小心写成了其他端口(比如33060,MySQL的X协议端口)。
- 检查是否开启了SSL强制连接:如果SERVER2的MySQL配置了
require_secure_transport=ON,而你的Node连接代码没启用SSL,就会连接失败。可以在连接选项里加上ssl: { rejectUnauthorized: false }(测试用,生产环境要配置正确的证书)试试,或者查看MySQL的require_secure_transport参数值。 - 连接超时设置太短:如果网络延迟高,默认的超时时间可能不够,可以在连接选项里增大
connectTimeout的值(比如设为10000,即10秒)。
检查SERVER1的出站防火墙规则:你只检查了SERVER2的UFW,但SERVER1的UFW或者其他防火墙可能限制了出站到3306端口的流量?可以在SERVER1上临时关闭UFW测试:
sudo ufw disable,如果能连上了,就说明是SERVER1的出站规则问题,需要添加允许到SERVER2 3306端口的出站规则。再次确认MySQL用户的主机权限:虽然你说用户有远程权限,但要确认用户的主机字段是不是
%(允许所有IP)或者具体的SERVER1的IP,而不是localhost或者其他限制IP。可以在SERVER2的MySQL里执行SELECT user, host FROM mysql.user;查看对应的用户主机配置。
内容的提问来源于stack exchange,提问作者Stiofán

