502 Bad Gateway
502 代表什么、和 503、504 差在哪里,以及当你自己的服务器回 502 时该检查什么。
在你的浏览器中运行
点一下代码即可复制。
5xx · 服务器错误
请求本身没有问题,是服务器没能处理好。
| 代码 | 意义 |
|---|---|
| Internal Server Error | 出了问题,而服务器说不出更具体的原因。 |
| Not Implemented | 服务器根本不支持这个要求。 |
| Bad Gateway | 代理服务器向上游询问,却拿到一个无法使用的响应。上游有响应,只是回得不对。504 是上游没有在时限内响应,503 则是这台服务器自己决定不处理。 |
| Service Unavailable | 暂时不提供服务,可能是超载或正在维护。 |
| Gateway Timeout | 代理服务器等待上游响应,最后放弃了。 |
没有符合的状态码。
中间那台机器拿到了一个坏答案
502 来自一台不是原本该回答你的机器。某个代理服务器、负载均衡器或 CDN 把你的请求往上游 送,收到了回应,却看不懂那是什么。
所以 502 从来就不是在讲你问的那台服务器,而是在讲它后面两台机器之间的对话——这正是为什么 它从外面完全看不出原因,在日志里却一目了然。
502、503、504 是三种不同的失败
| 代码 | 发生了什么 |
|---|---|
| 502 | 上游回了但回得不对——格式错误,或连线在回应中途断掉 |
| 503 | 这台服务器自己决定不处理——超载,或正在维护 |
| 504 | 上游没有在时限内回应 |
在你自己的服务里把这三个用对,比想像中重要:带着 Retry-After 头部的 503 能明确告诉客户端
什么时候可以再来,而 502 什么有用的信息都没给。
如果是别人的网站出现 502
你能做的很少,而且几乎绝不是你这端的问题。过一分钟再重新整理。如果换网络、换设备都还是这样, 那就是他们的问题。
有一件事值得排除一次:你自己这边过期的缓存转址,或是公司的代理服务器,也可能产生一个只有你 看得到的 502。
如果是你自己的服务器在回 502
常见原因大致依序如下:
- 代理后面的应用程序没有在跑,或崩溃后没有重启。先检查行程,其他都放在后面。
- 它在监听别的地方——端口不对,或绑在
127.0.0.1而代理预期的是0.0.0.0,这在 容器环境里极为常见。 - **它在回应到一半时死掉。**回应大量数据时被 OOM 杀掉,产生的是 502 而不是 500,因为代理 看到的是一个被截断的答案。
- **超时设定不一致。**如果代理的超时比应用程序短,缓慢的请求就会在高负载时变成 502 或 504, 而且在测试环境永远重现不出来。
- **头部太大。**过大的 cookie 或
Authorization头部可能超过代理的缓冲区,回应就被判定为 格式错误而遭拒。
在这种情况下,应用程序的日志几乎总是比代理的日志更有用。代理只知道那个答案不能用,应用程序 才知道为什么。