502、503和504有什么区别?反向代理与上游服务排查方法

先确认状态码由哪一层生成,再判断是错误响应、暂时不可用还是等待超时
发布于
3

用户说“网站报网关错误”,日志里却交替出现502、503和504。三者都可能由反向代理、API网关或负载均衡返回,但表达的故障阶段不同;把它们统一归为“后端挂了”,会浪费排查时间。

三个状态码的常见含义

状态码 典型含义 常见证据
502 Bad Gateway 网关从上游收到无效响应或连接异常 连接拒绝、TLS失败、上游重置
503 Service Unavailable 服务暂时不可用 无健康节点、维护、限流、过载保护
504 Gateway Timeout 网关等待上游响应超时 连接或读取阶段超过期限

具体产品可能在不同条件下选择不同状态码,必须结合响应头、网关日志和配置解释。

先找出是谁生成状态码

CDN、WAF、外层负载均衡、API网关和应用反向代理都可能生成错误页。查看Server、Via、请求ID和各层访问日志,但不要只凭错误页样式绝对判断。最可靠的方法是用统一请求ID和UTC时间串联每一层。

502通常发生了什么

代理连接不上目标端口、上游在完整响应头之前断开、返回不符合HTTP格式的数据,或代理到上游TLS/SNI不匹配,都可能是502。若日志明确写connection refused,继续增加读取超时没有意义,应检查进程监听、地址、健康状态和防火墙。

503是谁在保护谁

应用可以主动返回503,代理在无可用后端、连接队列满或触发熔断时也会返回503。若响应包含合理的Retry-After,客户端可据此延后重试。维护页面、容量限制与依赖熔断应有不同日志标签,便于区分计划事件和事故。

504为何不能只调大超时

504说明网关在规定时间内没有拿到预期响应。真正耗时可能在DNS、建连、TLS、排队、应用计算、数据库或第三方接口。统一把超时从30秒改为300秒,会增加占用连接和内存的请求数量,故障高峰反而更严重。

多层超时如何排列

外层客户端Deadline应覆盖合理业务时长,内层组件要留出返回错误和清理资源的窗口。若外层先超时,内层仍继续计算,就会产生无主请求;若内层过短,则正常慢请求也被提前切断。需要按完整调用链设计,而不是每层独立取默认值。

健康检查通过仍会503

只检查TCP端口的健康探针可能认为节点可用,但应用线程池、数据库连接池或关键依赖已经耗尽。健康检查应反映接收新请求的能力,又不能执行过重查询拖垮系统。就绪与存活检查也要区分。

上游重置与502

上游若发送TCP RST,代理可能转成502。关于RST来源、连接池和空闲超时,可参考Connection Reset的分层排查,客户端最终看到的502不代表代理本身就是最初故障点。

重试要考虑幂等

GET等读取可有限退避重试,并换健康节点;POST写入可能已在上游执行,只是响应丢失。网关与客户端同时重试会成倍放大流量,应规定唯一责任层、最大次数、随机抖动和幂等键。

建议记录的字段

  • 请求ID、路由、方法、状态码与生成组件;
  • 选中的上游地址、连接时间、首字节时间和总耗时;
  • 重试次数、上游状态、响应标志与熔断原因;
  • 应用队列、线程池、连接池和依赖耗时;
  • 错误发生前后的发布、扩容和配置变更。

结论

502、503和504分别提示上游响应异常、暂时不可用和等待超时,但真正根因仍需由生成层日志确认。沿着请求时间线核对连接、健康、容量和依赖,比统一扩大超时或无限重试更可靠。

常见问题(FAQ)

502一定是后端程序崩溃吗?
不一定。代理无法连接、TLS失败、收到无效响应或上游提前断开都可能生成502。
503表示服务器正在维护吗?
维护只是其中一种情况。无健康上游、容量保护、限流或应用主动拒绝也可能返回503。
504把代理超时调大就能解决吗?
不一定。若上游卡死、依赖变慢或连接池耗尽,调大只会让请求占用资源更久,应先定位耗时阶段。
这些错误可以自动重试吗?
应按请求幂等性、Retry-After、次数和退避策略决定;写操作不能因为网关错误就无条件重试。

本文由作者原创/授权发布于极跃圈(jiyueip.com)未经许可,禁止转载。题图来自Unsplash,基于CC0协议。

声明:极跃圈(JIYUEIP.com)内网友所发表的所有内容及言论仅代表其本人,并不反映任何极跃圈(JIYUEIP.com)之意见及观点。

0 讨论
热门最新
总结
暂无总结
0 / 600