Skip to content
数据库与网关故障排查 · 第 3 篇 / 共 4 篇
领域生产问题
专题数据与基础设施排障专题
当前序列数据库与网关故障排查
阅读位置第 3 篇 / 共 4 篇当前专题第 1 个序列 / 共 5 个序列

生产问题:Nginx 502 怎么排查,先看网关还是先看后端服务

Nginx 502 是非常典型的一类线上问题。

它最容易让人误判的地方在于:

  • 表面报错出现在 Nginx
  • 但根因往往不一定在 Nginx 本身

很多现场里,大家一看到 502 就会同时怀疑:

  • Nginx 配置改坏了
  • 网关挂了
  • 后端服务挂了

实际上 502 更像一个“上游拿不到正常响应”的统一外显,真正根因可能在网关、应用、容器、线程池、数据库,甚至是发布切换过程本身。

先说结论

排查 502 更实用的顺序通常是:

  1. 先确认上游服务是否可用
  2. 再看 Nginx 和上游的连接方式是否匹配
  3. 再看超时、进程状态和资源耗尽
  4. 最后再回到网关配置细节

也可以简单记成:

  • 先看上游活没活
  • 再看上游是不是已经慢死了
  • 最后才看 Nginx 自己是不是配错

一、502 通常意味着什么

可以先粗略理解成:

  • Nginx 能收到请求
  • 但没能从上游拿到一个正常响应

所以第一反应不应该只是改配置,而是先判断:

  • 上游到底是不是活着

很多情况下,Nginx 只是第一个把错误暴露出来的环节,不是问题发起点。

二、最常见的几类原因

1. 上游服务根本没起来

比如:

  • Java 进程挂了
  • 容器重启中
  • 端口没监听成功

2. 上游返回异常或连接被拒绝

这类情况本质上更像是:

  • Nginx 连不上后端

3. 超时或资源耗尽

比如:

  • 后端线程池打满
  • 数据库连接卡住
  • 接口 RT 飙升

最后 Nginx 只是先把错误暴露出来。

4. 代理配置和服务协议不匹配

这类问题在多环境部署、网关转发或容器迁移时也很常见。

例如:

  • 目标端口改了但 upstream 没改
  • HTTP/HTTPS、http1/http2 配置不匹配
  • Unix socket 和 TCP 目标不一致
  • 容器服务发现地址过期

三、一个更实用的排查顺序

第一步:先确认后端服务活没活

重点看:

  • 进程是否存在
  • 端口是否监听
  • 健康检查是否正常

如果后端服务已经不在了,或者 Pod 本身就在重启,Nginx 怎么调都只是表面处理。

第二步:看后端服务是不是“活着但已经很慢”

如果服务没挂,但线程池和连接池都满了,也很容易表现成 502。

这时业务常见的特征是:

  • 应用进程还在
  • 端口也能连
  • 但是请求进去后长时间拿不到响应

第三步:看 Nginx 错误日志

要搞清楚到底是:

  • 连接不上
  • 连接被拒绝
  • 读超时
  • 上游提前断开

这是非常关键的一步,因为不同报错方向差别很大:

  • connect() failed 更像连不上
  • upstream timed out 更像后端太慢
  • upstream prematurely closed connection 更像后端自己断了

第四步:再看配置

包括:

  • upstream 配置
  • 超时配置
  • 代理目标地址

如果是最近发版、迁移、切流后出现的 502,更要把变更记录一起对上。

四、最容易踩的坑

1. 一看到 502 就重启 Nginx

如果根因在后端,重启网关通常只是暂时掩盖现象。

2. 只看 Nginx,不看应用日志

很多 502 的真正根因,其实在应用服务或下游数据库里。

3. 只改超时配置

如果后端已经明显异常,单纯放大超时只会让问题暴露得更晚。

五、一个更现场化的判断顺序

如果线上突然大面积 502,我通常按这个顺序看:

  1. 先确认是不是所有 upstream 都受影响,还是只有某一组服务有问题。
  2. 看后端进程、Pod、监听端口、健康检查是否正常。
  3. 看 Nginx 错误日志属于连接失败、拒绝、超时还是提前断开。
  4. 看后端应用日志里是否有线程池打满、连接池耗尽、OOM、重启、GC、下游超时。
  5. 最后再回头审网关配置、代理协议、端口、服务发现和最近变更。

这样更容易分清是网关问题,还是后端服务或其下游的问题。

一句话总结

Nginx 502 排查最重要的不是先改网关参数,而是先分清:

  • 后端是不是挂了
  • 后端是不是慢了
  • 还是网关和上游的连接关系配错了

把“上游存活、上游时延、Nginx 错误日志、最近变更”这几条线一起看,通常比一上来改 timeout 或重启 Nginx 更有效。

延伸阅读相关文章优先当前专题,再补跨专题关联。
同一序列 · 顺着当前主线继续读磁盘打满时怎么排查适合把数据库连接、死锁、网关异常和磁盘空间问题放在一条排障线上看。数据与基础设施排障专题 · 数据库与网关故障排查同一序列 · 回看前文会更完整MySQL 连接数打满时怎么排查适合把数据库连接、死锁、网关异常和磁盘空间问题放在一条排障线上看。数据与基础设施排障专题 · 数据库与网关故障排查同专题其他序列 · 共享标签:线上排障、案例排障磁盘打满后为什么删除文件不一定立刻生效适合把 Redis 抖动、MySQL 连接打满、MQ 积压、ES 发黄、ClickHouse 合并堆积和磁盘打满放在同一条基础设施排障主线上看。数据与基础设施排障专题 · 数据与基础设施故障的分层排查同专题其他序列 · 共享标签:线上排障、案例排障数据库死锁和锁等待超时案例怎么复盘适合把 K8s、RabbitMQ 和数据库锁等待问题放在一条故障治理主线上看。数据与基础设施排障专题 · 基础设施与中间件故障案例跨专题关联 · 共享标签:线上排障、案例排障大 Header、buffer、timeout 问题怎么排查适合把 location 匹配、缓冲区和负载均衡放在一起看。容器与站点部署专题 · Nginx 进阶路由与代理治理跨专题关联 · 共享标签:线上排障、案例排障缓存穿透、击穿、雪崩与缓存一致性适合把缓存更新、击穿雪崩、回源策略和事务边界放到同一条缓存治理主线上看。Redis 专题 · Redis 缓存一致性与更新策略
继续阅读数据库与网关故障排查当前序列第 3 篇 / 共 4 篇当前专题第 1 个序列 / 共 5 个序列
往前看
上一篇数据库死锁和锁等待超时案例怎么复盘回到当前序列上一章上一序列应用运行时异常排查从第 1 篇开始:CPU 飙升时怎么排查
往后看
下一篇磁盘打满时怎么排查继续当前序列下一章下一序列缓存、消息与检索故障排查从第 1 篇开始:Redis 热 Key 突增时怎么止血和回查

把零散经验整理成可查、可复用、可持续更新的企业级知识门户