Nginx/Node/MongoDB站点502 Bad Gateway(111:Unknown error)排查
故障根因分析
从错误日志和现象判断,核心故障是Nginx无法和本地127.0.0.1:5005的Node服务建立TCP连接,两个访问异常分别对应:
- HTTPS访问返回502 Bad Gateway:Nginx反向代理请求转发阶段触发连接拒绝,错误码
111是Linux内核返回的连接被拒响应,不是Nginx本身配置语法错误。 - HTTP访问返回404 Not Found:当前80端口的请求没有匹配到正确的站点虚拟主机(vhost)规则,落到Nginx默认vhost上返回默认404页,属于次要配置问题。
- 公网检测5005端口关闭属于正常状态:Node服务作为上游应用不需要暴露公网,EC2安全组仅放通80、443端口是合理的安全配置,这个点不需要调整。
结合“此前运行正常、约一个月前突发异常”的时间线,故障触发概率从高到低排序如下:
- SELinux安全策略拦截:AWS Amazon Linux 2默认开启SELinux,系统自动更新后默认策略会禁止Nginx(属于httpd安全上下文)连接本地非标准Web端口,是这类突发故障的最高发原因。
- Node服务仅监听IPv6回环地址:Node启动时如果绑定
localhost,部分系统会优先解析到IPv6地址::1,此时服务只监听IPv6回环,Nginx请求IPv4的127.0.0.1:5005会被直接拒绝,而本地curl测试时会自动适配IPv6/IPv4所以表现为访问正常。 - 站点vhost配置冲突:Certbot自动生成SSL配置时可能出现规则优先级问题,导致80端口请求匹配到默认vhost、443端口的上游转发规则失效。
分步修复方案
按以下顺序操作,每步完成后测试访问状态,定位到问题后不需要继续后续步骤:
验证SELinux拦截问题
执行以下命令临时关闭SELinux测试:sudo setenforce 0刷新浏览器访问HTTPS站点,如果恢复正常,即可确认是SELinux拦截。不要长期关闭SELinux,执行以下命令永久放通Nginx的网络连接权限:
sudo setsebool -P httpd_can_network_connect 1 sudo setenforce 1执行完成后再次测试访问即可。
确认Node服务监听地址
如果关闭SELinux后故障依旧,执行以下命令查看5005端口的实际监听状态:ss -tulpn | grep 5005- 如果输出的本地地址列显示为
::1:5005,说明服务仅绑定了IPv6回环。修改Node服务启动代码,将listen参数明确指定为绑定IPv4回环:
重启Node服务后再测试。// 原代码如果是app.listen(5005) 或者 app.listen(5005, 'localhost') app.listen(5005, '127.0.0.1') - 如果输出显示为
127.0.0.1:5005,进入下一步排查。
- 如果输出的本地地址列显示为
修正Nginx虚拟主机配置
你贴出的是Nginx主配置,所有站点规则存放在/etc/nginx/sites-enabled/目录下,执行以下操作:- 先删除默认vhost配置避免冲突:
sudo rm -f /etc/nginx/sites-enabled/default - 编辑对应alltimeschool.com的站点配置,确保80端口的server块添加强制HTTPS跳转规则:
server { listen 80; server_name alltimeschool.com www.alltimeschool.com; return 301 https://$host$request_uri; } - 确认443端口的server块中反向代理配置正确:
location / { proxy_pass http://127.0.0.1:5005; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
配置修改完成后执行以下命令检查语法并重载Nginx:
sudo nginx -t sudo systemctl reload nginx- 先删除默认vhost配置避免冲突:
极端场景排查
如果以上操作都无效,执行sudo iptables -L -n -v检查本地防火墙规则,确认lo回环网卡的流量没有被DROP规则拦截,正常情况下回环网卡的所有流量应该默认放通。
内容的提问来源于stack exchange,提问作者dearut
相关产品推荐
相关产品推荐

