站点突然全站 502,登录服务器一看 php-fpm 进程活着,重启 Nginx 也没用。502 的含义是网关连不上上游,进程在不在和能不能连上是两件事。

先看错误日志的原文

tail -n 30 /var/log/nginx/error.log

connect() failed (111: Connection refused) 说明 Nginx 连的地址上没有服务;upstream prematurely closed connection 说明连上了但后端崩了;No such file or directory 则是 socket 路径写错。

核对监听方式是否一致

ss -lntp | grep 9000
grep -n "^listen" /etc/php/*/fpm/pool.d/www.conf

一边监听 127.0.0.1:9000,另一边 fastcgi_pass 写 unix:/run/php/php-fpm.sock,就会一直 502。两边必须统一:要么都用 TCP,要么都用同一个 socket 文件。

socket 权限也要看

用 unix socket 时,池配置里的 listen.owner 和 listen.group 要和 Nginx 运行用户一致,否则 Nginx 没权限连接,日志里表现为 permission denied。

改完先测再重载

nginx -t && systemctl reload nginx
systemctl status php-fpm --no-pager

如果只有大请求才 502,检查 fastcgi_read_timeout 和 PHP 的 max_execution_time,导入数据、生成报表这类长任务很容易踩到默认的 60 秒。

还有一种情况是进程数被打满

pm.max_children 设得太小,并发一高就排不上队,表现是间歇性 502 而不是全站挂掉。看 /var/log/php-fpm/www-error.log 里的 server reached pm.max_children 提示,按内存余量适当上调,别直接抄一个很大的数字,进程开太多会把内存撑爆。

排查顺序固定下来:先看 Nginx 错误日志的原句,再核对监听方式,最后才是进程数和超时。三步走完,绝大多数 502 都能定位到具体一行配置。

作者 9823189

发表回复