Nginx 502 排障
从配置、错误日志到上游监听,区分连接拒绝、超时与异常响应。
适用范围与前提
Linux 上的 Nginx HTTP 反向代理;需区分宿主机与容器网络。
- 仅在获授权的主机上操作;日志可能需要 sudo。
- 示例上游为 127.0.0.1:3000,替换为配置中的地址和只读健康检查路径。
- 先记录故障时间、请求路径和近期变更,不先重启服务。
命令仅供手动复制到获授权的环境执行。站点不会连接服务器;涉及网络的诊断可能产生请求或登录审计记录。
1. 检查配置语法及实际加载配置
sudo nginx -t
sudo nginx -T预期现象:语法检查成功;确认请求命中的 server/location 和 proxy_pass。完整配置可能含敏感信息。
- 语法错误或 upstream 配错:先制定修复方案 → 修复建议(需人工确认)
- 配置正确:定位同一时间的错误日志 → 读取有限范围的错误日志
2. 读取有限范围的错误日志
sudo tail -n 100 /var/log/nginx/error.log预期现象:connect() failed 常见于连接拒绝;upstream timed out 表示连接或响应超时;prematurely closed 表示上游提前关闭。日志路径以实际配置为准。
- 连接拒绝或上游提前关闭:检查监听及进程 → 检查上游监听
- 超时:同时检查上游可达性及应用耗时 → 从 Nginx 所在网络环境检查上游
- 无对应日志:检查日志路径与请求是否到达该节点 → 升级求助前收集
3. 检查上游监听
sudo ss -ltnp预期现象:上游端口应在 Nginx 可达的地址监听;容器中的 127.0.0.1 不等于宿主机。
- 未监听或监听地址不匹配 → 修复建议(需人工确认)
- 监听正常 → 从 Nginx 所在网络环境检查上游
4. 从 Nginx 所在网络环境检查上游
curl --max-time 5 -I http://127.0.0.1:3000/health预期现象:此命令会在你的主机上发出请求;使用已确认安全的健康检查路径。HEAD 不支持时可能返回 405,不能直接判定服务宕机。
- 超时、拒绝连接、异常响应 → 修复建议(需人工确认)
- 上游正常但代理仍异常:收集节点差异与请求细节 → 升级求助前收集
修复建议(需人工确认)
- 备份相关配置并经人工确认后修正 upstream 地址或协议;先通过 nginx -t 再安排平滑加载。
- 应用未运行时调查退出原因,由服务负责人决定恢复;不要循环重启掩盖问题。
- 超时先调查应用、DNS、路由和访问策略,不盲目增大超时或关闭防火墙/SELinux。
验证恢复
- 从上游和代理入口分别验证已授权的健康检查。
- 观察错误日志和一段时间内的 5xx 变化,确认所有节点均恢复。
升级求助前收集
- 故障时间及时区、命中节点、脱敏错误日志、上游地址、近期配置变更。
- 不要直接分享 nginx -T 的完整输出或用户请求凭据。