凌晨两点,群里一张截图:502 Bad Gateway。

第一反应都是「服务器挂了」。可十次里有四次,服务器活得好好的,是它前面那一层找不到它,或者等它等烦了。

502 是谁发出的

链路一般是:用户 → CDN 或负载均衡 → Nginx → php-fpm 或其他后端。

502 通常由「前一跳」发出,含义是:我把请求转给后面那台了,但它没给我一个像样的回答。所以问题一定在网关和后端之间这一段,不在用户那边,也不一定是整台机器挂了。

第一步:一次全节点测速,定范围

全节点都在 502,问题在后端或者网关配置,属于共性问题。

只有个别地区 502,先怀疑那一层的 CDN 节点、回源链路,或者多机部署里某一台没起来。这两种情况的处理方向差得很远,先分清楚再动手。

第二步:看 TTFB,分清「拒绝」和「超时」

同样是 502,耗时不一样,病因也不一样。

TTFB 只有几十毫秒就返回 502,说明网关连都没连上后端。常见是端口没监听、进程挂了、upstream 地址写错。这种情况查起来最快。

TTFB 卡了几十秒才 502,是等超时了。Nginx 的 proxy_read_timeout 默认 60 秒,后端处理不完,网关就先放弃。这时候后端其实还在跑,只是慢。

三条命令,比翻日志快

先确认端口活着:ss -lntp | grep -E '9000|8080'。没有输出就是服务没起。

再绕开网关直连后端:curl -I http://127.0.0.1:9000。这条通、外面不通,问题在 Nginx 配置。

最后看错误日志里搜两个关键词:connect() failed(连不上)和 upstream prematurely closed connection(后端主动断开)。这两句基本覆盖了八成 502。

几个「重启治不好」的原因

php-fpm 子进程打满,表现就是间歇 502。重启能好三分钟,然后继续。要看 pm.max_children 和慢脚本,不是重启。

CDN 回源协议配错也很常见:源站只开 443,回源却配了 80,或者反过来。这种 502 稳定复现,改配置就好。

还有后端自己断连接:PHP 的 max_execution_time 到了,或者应用里的超时设置比网关短,进程先退出,网关卡在半路。

修完记得复测

浏览器刷新一次能打开,不代表修好了。用同样的参数在全节点再跑一次,确认各地都正常,才算收工。

测速入口在 网站测速,状态码和五段耗时会直接告诉你,是连不上还是等太久。