502、503、504 背后分别是哪一环出了问题:一次 HTTP 状态码排错
线上服务出问题时,浏览器给你的往往不是一句人话,而是一个三位数:502、503、504。它们都长在 5xx 家族里,都表示“服务器这边出了问题”,但“服务器这边”到底是哪一边,三个码说的完全是三回事。排错的第一步,就是先把责任分到正确的环节上,否则很容易在没坏的地方折腾半天。
一、先把链路画出来:请求到底经过了几手
一个常见的部署是:用户 → CDN → Nginx 反向代理 → 应用服务 → 数据库。502、503、504 的区别,就藏在这条链上“谁先开口说不行”。
502 Bad Gateway:中间的代理(Nginx、CDN)收到了请求,也去找后端了,但后端给了一个它没法理解的答复,或者根本没接上。后端可能挂了、端口没监听、进程刚重启。
503 Service Unavailable:服务明确说“我现在接不了”。后端还活着,但过载、正在维护、连接池满了,或者主动限流。
504 Gateway Timeout:代理去找后端了,但后端迟迟不回,代理等到超时,只能先回一个 504。后端可能没死,只是太慢了。
一句话记:502 是“后端答得不对”,503 是“后端说没空”,504 是“后端答得太慢”。
二、502:先看后端在不在,再看它说了什么
502 的排查顺序很固定,从“活没活”开始。先确认后端进程还在不在、监听端口对不对:ss -ltnp 看端口,curl 127.0.0.1:端口 直接绕过代理打后端。如果本机 curl 都不通,问题在后端本身:进程死了、端口改了、启动失败,看应用日志。
如果本机 curl 能通但经 Nginx 还是 502,检查 Nginx 的 upstream 地址写得对不对,重点是端口和协议:后端只监听了 127.0.0.1,upstream 却写了外网地址;后端是 HTTP,upstream 却配了 https,都是常见写法错误。Nginx 的 error.log 会直接写“connect() failed”或“upstream prematurely closed connection”,比猜快得多。
还有一类 502 是后端“答了一半”:应用处理请求中途崩溃、网关超时前就断了连接。这时看应用日志里请求处理到哪一步就停了,通常是某个依赖(数据库、外部接口)先挂了。
三、503:先区分是真过载,还是有人主动关了门
503 先看是不是计划内的:服务正在发布、维护窗口、主动限流,都会返回 503。很多服务在维护时会挂一个专门的维护页,这类 503 不用修,等发布完成就好。
不是计划内的 503,接着看资源:CPU、内存打满,连接池耗尽,都会让服务拒绝新请求。用 top 看负载,用应用的连接池指标看等待队列。如果是突发流量冲垮的,临时办法是限流和扩容,先保住核心接口;长期办法是把慢接口找出来,慢接口才是把连接池占满的真凶。
另外注意 CDN 层也可能自己返回 503:源站不可用时,CDN 会替源站说 503。这时直接 curl 源站 IP 绕过 CDN,就能分清是源站的问题还是 CDN 到源站的链路问题。
四、504:超时时间是谁定的,就去改谁的
504 一定先看日志里的时间线:Nginx 的 access.log 会记录 upstream_response_time(后端耗时)和 request_time(总耗时)。如果 upstream_response_time 接近 Nginx 的 proxy_read_timeout(默认 60 秒),说明后端真的慢到了超时线;如果 upstream_response_time 很小但还是 504,问题可能在代理到后端的网络上。
后端慢的常见原因就几个:SQL 没走索引全表扫、外部接口拖着不回、锁竞争。先看慢查询日志和应用的耗时统计,别一上来就加机器。
改超时配置要谨慎:把 proxy_read_timeout 从 60 秒调到 300 秒,能让慢请求“不再报 504”,但代价是连接被占得更久,并发一上来更容易把服务拖垮。正确顺序永远是先找到慢的原因,实在是业务本身就需要长耗时(比如大文件导出),再把超时和对应接口单独放宽,不要全局调大。
五、排错时顺手记一张对照表
502:代理能到后端,但后端答得不对或没接上 → 查进程、端口、upstream 配置、error.log。
503:服务明确拒绝 → 查是否在维护、资源是否打满、连接池是否耗尽。
504:后端答得太慢 → 查 upstream_response_time、慢查询、外部依赖耗时。
下次再看到这三个码,先问一句“是谁在说话”:是代理在抱怨后端,还是后端自己在拒绝,还是代理等得不耐烦了。责任分对了,日志翻一半就能定位;责任分错了,重启三遍服务也还在原地。
(本文为个人运维实践记录。)
- 点赞
- 收藏
- 关注作者
评论(0)