← 中文资源

简体中文版本

HTTP 502 Bad Gateway — 代理无法访问上游

从反向代理追踪 502 到上游服务,区分后端宕机、地址或端口错误、超时和应用崩溃。

阅读英文原文

症状

浏览器收到 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 只在负载下出现,先测量上游饱和度和连接池上限,再调整代理超时。提高超时可能掩盖容量问题,而重试非幂等请求可能造成重复副作用。