502 Bad Gateway 怎么排查?
帮助502 的意思很明确:反向代理收到了请求,但它去找后端时没拿到有效响应。所以要查的永远是「代理和后端之间」这一段,和用户侧、DNS 都没关系。
三种典型情形
| 情形 | 特征 | 怎么确认 |
|---|---|---|
| 后端进程挂了 | 100% 报 502,一直不恢复 | 看后端进程在不在、端口有没有监听 |
| 后端超时 | 间歇 502,且响应慢的时候更容易出现 | 看错误日志里有没有 timeout 字样 |
| 反代配置错 | 改完配置立刻开始报 | 核对上游地址、端口和协议 |
按顺序查
1. 后端还活着吗
最快的判断方式是绕过代理直接访问后端:在服务器上对后端监听的地址和端口发一次请求。拿不到响应,问题就在后端本身,跟代理无关。进程还在但不响应,多半是线程 / 连接池被占满了——数据库慢查询、外部接口不返回、死锁,这三样最常见。
2. 是不是超时
反代日志里出现 upstream timed out 就是超时。这时候单纯调大超时时间只是把症状往后推,该做的是找出哪个请求慢。如果是个别接口慢(比如导出、报表),把它们单独配一个更长的超时,其余保持短超时,比全局调大安全得多。
3. 配置对不对
改过配置之后开始报 502,重点核对三件事:上游地址和端口写没写错、后端是 HTTP 还是 HTTPS(协议写反会直接失败)、用 unix socket 的话文件路径和权限对不对。改完先做配置语法检查再重载,别直接重启。
4. 连接数与文件描述符
高并发下的间歇性 502,很多是连接数打满或文件描述符不够。这类问题的特征是「平时正常、一到高峰就来一阵」,光看单次请求看不出来。
从外部怎么观察
手上暂时没有服务器权限时,可以先从外部收集证据:
- HTTP 状态检测 多测几次,看是稳定 502 还是时好时坏——这一条直接决定了排查方向。
- TCPing 测端口。端口通说明代理活着,那就是代理到后端这一段的问题。
- HTTP 响应头查看 看返回头里的
Server字段,确认这个 502 是哪一层发出来的:源站的 Nginx、还是前面的 CDN。CDN 回源失败也会给你一个 502,但要查的是完全不同的地方。
相关状态码别搞混
502 是「后端给了无效响应」,504 是「后端超时没给响应」,503 是「服务主动表示我现在不可用」。三者指向的原因不一样,看到具体哪个再决定查什么。完整对照可以看 HTTP 状态码大全。