症状
浏览器收到 502,而应用日志中没有对应请求;负载下间歇性 502,但直连后端成功;代理错误日志出现 connect() failed、upstream timed out 或响应无效。
诊断
tail -n 100 /var/log/nginx/error.log
curl -i --max-time 5 http://127.0.0.1:3000/healthz
ss -ltnp | grep 3000
先读代理错误日志:connection refused 表示没有监听者,upstream timed out 表示响应太慢,invalid header 表示上游返回了畸形响应。然后从代理所在主机直接访问上游:直连失败说明问题在上游;直连成功则比较代理配置与网络路径。ss 用于确认监听地址;只监听 127.0.0.1 的进程无法从其他容器或主机访问。
根因
反向代理无法从上游获得有效 HTTP 响应。上游可能不可达、拒绝连接、超时或返回无效响应,因此代理返回 502,而不是转发一个不完整结果。
修复
恢复上游进程;修正目标地址与端口;根据实测延迟调整超时;为上游增加健康检查;只对安全请求做有界重试;确保上游绑定到代理使用的接口。通过上游日志修复崩溃根因。
验证
- 公共 URL 返回 200 与预期内容。
- 负载测试期间代理错误日志没有新的 502。
- 上游健康端点正常。
- 上游日志能看到代理转发的请求。
- 超时与重试有文档记录且设有上限。
如果 502 只在负载下出现,先测量上游饱和度和连接池上限,再调整代理超时。提高超时可能掩盖容量问题,而重试非幂等请求可能造成重复副作用。