EC2实例升级重启后Node API连接MemSQL报ECONNREFUSED错误求助
别着急,AWS EC2实例升级(关机重启)不会自动变更端口,这个可以直接排除。咱们一步步拆解可能的问题点,帮你定位:
1. 先确认MemSQL服务是否正常启动
虽然你能SSH登录服务器,但MemSQL大概率在实例重启后没自动拉起。登录服务器后执行这些命令检查:
# 用MemSQL自带工具查看节点状态 memsqlctl list-nodes # 或者用系统服务管理命令(根据你的操作系统) systemctl status memsqld
如果服务没运行,先手动启动:systemctl start memsqld,顺便设置开机自启避免下次重启再出问题:systemctl enable memsqld。
2. 检查MemSQL的监听地址是否正确
很多时候,重启后MemSQL会默认只监听localhost(127.0.0.1),拒绝外部连接。你可以:
- 查看MemSQL配置文件(通常在
/etc/memsql.cnf或数据目录下的memsql.cnf),找到bind-address或listen_address参数,确认它设置为0.0.0.0(监听所有网卡)或者你的EC2实例的私网/公网IP。 - 用端口监听命令验证:
ss -tulpn | grep memsql
如果输出里只有127.0.0.1:3306(默认MemSQL端口是3306,如果你改过就对应你的端口),那就是只监听本地,外部自然连不上,修改配置后重启MemSQL服务即可。
3. 核对EC2安全组规则
你能SSH说明22端口是通的,但MemSQL的端口(比如3306)可能在实例升级过程中被安全组规则意外改动,或者你不小心切换了安全组?
登录AWS控制台找到这个EC2实例,查看它关联的安全组,确认入站规则里允许你的Node API服务器的IP(或者临时用0.0.0.0/0测试,但生产环境别这么做)访问MemSQL的端口。
4. 检查子网的网络ACL
如果安全组没问题,再看看实例所在子网的网络ACL——这是子网级别的防火墙,有时候可能被误改而没注意。要确保入站和出站规则都允许MemSQL端口的流量通过。
5. 再确认Node API的连接配置
虽然你说没修改配置,但排查阶段还是再核对下代码里的连接字符串,比如:
const connection = mysql.createConnection({ host: '你的EC2公网/私网IP', port: 3306, // 确认这个端口和MemSQL实际监听的一致 user: 'xxx', password: 'xxx', database: 'xxx' });
万一配置文件被意外覆盖或者有缓存问题,这一步能快速排除。
6. 从Node API服务器测试网络连通性
在Node API所在的服务器上执行以下命令,直接测试到MemSQL端口的连通性:
telnet 你的EC2IP 3306 # 或者用nc命令(如果telnet没装) nc -zv 你的EC2IP 3306
如果连接失败,说明是网络层面的问题(回到安全组/ACL排查);如果能通,那可能是Node API的依赖库或者代码逻辑问题(比如连接池配置,但概率很低,毕竟之前正常)。
内容的提问来源于stack exchange,提问作者red house 87

