EC2实例重启后Node.js服务运行但无法响应请求报502错误如何解决?
核心问题答复
实例重启后配置被修改/删除的可能性说明
该情况确实存在,常见的触发场景如下:
- 你使用了EC2临时实例存储卷存储配置文件,临时存储为非持久化存储,实例重启后所有存储内容会被重置,会导致Nginx反向代理规则、应用配置、hosts映射等自定义配置丢失
- 此前配置的规则未设置为永久生效:比如iptables/ufw的端口放行规则、端口转发规则仅临时生效未写入永久配置,实例重启后规则被自动清空
- 应用依赖的环境变量仅临时写入终端会话,未写入
~/.bashrc、/etc/profile或PM2的环境配置文件,实例重启后环境变量丢失,导致应用启动后逻辑异常
其他可能的故障原因
- 端口监听地址配置错误:使用netstat检查时确认80端口的绑定地址,若绑定的是本地回环地址
127.0.0.1而非0.0.0.0,公网请求无法到达服务端,会直接返回连接拒绝,需要修改应用代码的监听地址为0.0.0.0 - 实例内部防火墙拦截:安全组为EC2外层网络管控规则,若实例内部的iptables/ufw未放行80端口入站请求,公网访问同样会被拦截,可临时清空iptables规则验证:
iptables -F - 反向代理配置异常:如果此前使用Nginx/Apache做反向代理转发Node服务,实例重启后反向代理服务未启动、或转发规则/上游服务地址配置错误,都会返回502错误
- 应用自身逻辑异常:虽然PM2显示进程存活、端口处于监听状态,但应用逻辑存在运行时错误,比如数据库连接参数错误、依赖的第三方服务不可用,收到请求后无法正常返回响应,可直接在实例本地执行curl验证:
curl http://127.0.0.1:80,若本地访问也报错,说明是应用自身逻辑问题 - SELinux策略拦截:若实例使用CentOS/RHEL系操作系统,默认开启的SELinux可能会拦截80端口的HTTP请求,可临时关闭SELinux验证:
setenforce 0,若访问恢复正常,只需为80端口添加SELinux HTTP服务白名单即可
内容的提问来源于stack exchange,提问作者Ritish Gupta
相关产品推荐
相关产品推荐

