HTTP 504 Gateway Timeout
中间人等得不耐烦了:上游服务器没有在代理的时限内做出响应。
HTTP 504 是什么意思
HTTP 504 Gateway Timeout 由代理、负载均衡器或 CDN 发出,表示它向上游服务器发出的请求在超时时间内没有收到任何响应。与 502(上游给出了错误响应)不同,504 表示上游根本没有及时给出任何响应。
根本原因几乎总是幕后某个环节速度缓慢:一个昂贵的数据库查询、一个响应迟缓的外部 API,或被负载压垮而资源耗尽的应用线程池。
504 错误的常见原因
- 一个缓慢的数据库查询或缺失的索引,使某个端点耗时超过了代理允许的上限。
- 应用程序在等待一个本身缓慢或已宕机的外部 API。
- 后端已饱和:所有 worker 都在忙碌,请求在超时之前就已排队等待。
- 代理与上游之间的网络问题(路由、丢包、DNS)。
- 超时设置不匹配:应用程序确实需要 60 秒,而代理在 30 秒时就已切断。
作为访客该如何处理
- 稍等片刻后重试——单次 504 通常只是一次慢请求,而不是一次真正的故障。
- 对于你提交的操作(支付、订单),在重试之前先检查它是否实际已经完成。
作为开发者该如何修复
- 在访问日志/APM 中找到慢速端点:优化查询、添加索引、缓存结果。
- 把耗时的工作转移到后台任务,并快速返回一个客户端可以轮询的状态。
- 端到端地统一超时预算(应用 < 代理 < CDN),以便明确知道哪个环节最慢且这是有意为之的。
- 在不稳定的外部 API 周围添加熔断器,而不是让它们拖垮你的 worker。
示例响应
HTTP/1.1 504 Gateway Timeout Server: nginx Content-Type: text/html <html><body><h1>504 Gateway Timeout</h1></body></html>
常见问题
504 和 502 有什么区别?
504 表示上游在超时时间内始终没有响应;502 表示上游给出了某种无效响应。
504 是用户连接的问题吗?
不是——问题出在网站的代理和其后端之间。用户的网络本身是正常的。
如果收到 504,我提交的请求是否已被处理?
有可能是的——超时命中的是响应环节,不一定是处理过程本身。在盲目重试非幂等操作之前,应先检查其实际状态。