记录一次项目部署后 Nginx 无规律 502 Bad Gateway 问题的排查过程

望舒的头像
望舒
标签:
Nginx upstream timed out502 Bad GatewayDNS 重复解析线上问题排障记录

在一台 Linux 服务器上部署了一个 使用 Next.js 开发的前端网站,网站首次上线后 无规律地出现 502 Bad Gateway 错误 问题极其诡异且 无法稳定复现

架构如下:

  • Nginx:作为反向代理

  • Next.js(Node.js):提供 SSR / 页面服务

  • PM2:托管 Node 服务

  • 域名:通过服务商 DNS 解析到服务器公网 IP

问题表现

  • 网站在多数时间可以正常访问

  • 某些时刻会突然:

    • 页面加载明显变慢

    • 随后直接返回 502 Bad Gateway

  • 刷新几次后又可能恢复正常

  • 无固定触发条件(访问路径 / 用户 / 时间点 都不固定)

排查过程

Nginx 配置排查

第一反应是 Nginx 配置异常

  • proxy_pass 错误

  • 超时参数过短

  • header 转发不完整

但查看实际配置后,发现非常简单、标准:

复制
展开
# nginx 就这么一段简单的配置,转发到 nextjs 服务
location / {
      proxy_pass       http://127.0.0.1:3001/;
      proxy_set_header Host $http_host;
      proxy_set_header X-real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header x-forwarded-for $remote_addr;
}

随后查看 error.log,发现了关键线索,日志中偶尔出现如下错误:

复制
展开
upstream timed out
connect() failed (111)

这类错误 通常意味着 Nginx 无法及时连接到上游服务

因此初步怀疑 Next.js 服务存在卡顿或异常阻塞

Next.js 服务排查(PM2)

转而排查 Node / Next.js 服务本身

  1. 使用 pm2 logs 查看实时日志

    • 日志非常干净

    • 没有任何报错、异常、OOM 或未捕获异常

  2. 重启服务验证:

复制
展开
pm2 restart xxx
  1. 在服务器本地直接访问服务:
复制
展开
curl http://127.0.0.1:3001
  • 响应迅速

  • 页面正常返回

此时可以基本排除 Next.js 服务本身存在持续性异常

再次回到 Nginx,观察实时访问行为

由于问题依旧存在,于是回到原点,从“请求是否真的到达服务器”这个角度重新审视。

采取的方式是:

  • 浏览器不断刷新页面

  • 同时实时查看 Nginx access.log

正常请求时的日志

复制
展开
XX.152.XX.194 - - [25/Jan/2025:17:52:59 +0800] "GET /assets/images/favicon.ico HTTP/2.0" 200 962025 "https://www.xxx.com" "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Mobile Safari/537.36 T7/6.3"

异常现象(关键)

当浏览器返回 502 Bad Gateway 时:

  • Nginx access.log 没有任何记录

  • error.log 也没有新的输出

  • 仿佛这次请求从未到达服务器

502 并不是 Nginx 返回的,而是在到达服务器之前就已经失败了

排查域名与 DNS 配置

既然请求没有进入服务器,那么问题很可能出现在:

  • DNS 解析

  • CDN / 代理层

  • 服务商网络

于是检查域名解析配置,结果发现一个异常情况:

DNS 中存在十几条重复的 A 记录,且全部指向同一个 IP

虽然表面看起来:

  • 指向同一 IP

  • 似乎“结果是一样的”

但这并不是一个正常或推荐的配置方式

修复与验证

处理方式:

  1. 删除所有重复的 A 记录

  2. 仅保留 一条正确的解析

  3. 等待 DNS 缓存刷新

结果:

  • 网站访问恢复稳定

  • 再未出现 502 Bad Gateway

  • Nginx / PM2 日志均无异常

问题原因分析

综合现象与修复结果,问题极有可能出在 DNS 层面。虽然多条 A 记录指向同一 IP 不会改变最终解析结果,但在实际网络请求过程中,可能会在以下层面放大问题:

  • DNS 解析缓存行为异常

  • 客户端 / ISP 的解析轮询或 hash 失衡

  • TCP 连接复用(keepalive)异常

  • 连接池命中率降低

  • 某些请求长时间阻塞,最终超时

这些问题叠加后,最终表现为:

请求在客户端或网络层被卡死,根本没有到达服务器,浏览器只能收到一个模糊的 502 Bad Gateway

作者:https://blog.xn--rpv331d.com/望舒

链接:https://blog.xn--rpv331d.com/望舒/blog/138

转载请保留文章出处...

No data
No data