502、503、504 背后分别是哪一环出了问题:一次 HTTP 状态码排错

举报
yd_214534406 发表于 2026/11/13 09:49:32 2026/11/13
【摘要】 线上服务出问题时,浏览器给你的往往不是一句人话,而是一个三位数:502、503、504。它们都长在 5xx 家族里,都表示“服务器这边出了问题”,但“服务器这边”到底是哪一边,三个码说的完全是三回事。排错的第一步,就是先把责任分到正确的环节上,否则很容易在没坏的地方折腾半天。一、先把链路画出来:请求到底经过了几手一个常见的部署是:用户 → CDN → Nginx 反向代理 → 应用服务 → ...

线上服务出问题时,浏览器给你的往往不是一句人话,而是一个三位数: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、慢查询、外部依赖耗时。

下次再看到这三个码,先问一句“是谁在说话”:是代理在抱怨后端,还是后端自己在拒绝,还是代理等得不耐烦了。责任分对了,日志翻一半就能定位;责任分错了,重启三遍服务也还在原地。

(本文为个人运维实践记录。)

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。