502错误本质是nginx无法连接php-fpm:需确认php*-fpm服务运行、fastcgi_pass与listen地址严格一致(如unix:/run/php/php8.2-fpm.sock)、socket属组为www-data且权限0660,并查php-fpm.log定位超时或子进程耗尽问题。

502 错误在 PHP 独立环境里,基本可以断定是 Nginx 没连上 PHP-FPM,而不是代码写错了。 它不报错在 index.php 里,而是卡在请求转发那一步——你刷新页面,Nginx 日志里就刷一条 connect() failed (111: Connection refused) 或 recv() failed (104: Connection reset by peer),这就够了。
确认 PHP-FPM 进程是否真在跑、监听地址对不对
很多人只看 systemctl status php*-fpm 显示 “active (running)”,就以为万事大吉。其实它可能监听了 127.0.0.1:9001,而你的 Nginx 写的是 fastcgi_pass 127.0.0.1:9000;,差一个端口就是 502。
- 查实际监听配置:
sudo cat /etc/php/*/fpm/pool.d/www.conf | grep listen,注意输出是不是带空格或注释行干扰 - 查当前生效的 socket 路径:
ls -l /run/php/*.sock,比如/run/php/php8.2-fpm.sock存在,但php8.1-fpm.sock不存在,说明版本不匹配 - 查 PHP-FPM 实际监听状态:
sudo ss -tuln | grep ':9000\|php.*sock',没输出=没监听;有输出但 IP 是::1(IPv6)而 Nginx 写的是127.0.0.1(IPv4),也会连不上
检查 Nginx fastcgi_pass 和 PHP-FPM listen 的协议与路径是否严丝合缝
这一步最常出低级错误:多一个斜杠、少一个 unix: 前缀、路径写成 /var/run/ 而不是 /run/,全都会 502,且不报具体原因。
- 若 PHP-FPM 配置为
listen = /run/php/php8.2-fpm.sock,Nginx 必须写:fastcgi_pass unix:/run/php/php8.2-fpm.sock;(unix:不可省) - 若 PHP-FPM 配置为
listen = 127.0.0.1:9000,Nginx 必须写:fastcgi_pass 127.0.0.1:9000;(不能写成localhost:9000,DNS 解析失败时会静默失败) - 改完 Nginx 配置后务必执行:
sudo nginx -t && sudo systemctl reload nginx,只 reload 不 test 容易忽略语法错误
验证 Nginx worker 用户是否有权限访问 socket 文件
路径对了、进程也跑了,但 ls -l /run/php/php8.2-fpm.sock 显示 owner 是 root、group 是 root,而 Nginx worker 是 www-data 用户,那它连 socket 文件都打不开,直接 502。
- 查 Nginx 运行用户:
grep "user" /etc/nginx/nginx.conf,常见为user www-data; - 查 socket 所属:
ls -l /run/php/php*.sock,第三列是 owner,第四列是 group - 若不一致,在
/etc/php/8.2/fpm/pool.d/www.conf中补全三行:listen.owner = www-data、listen.group = www-data、listen.mode = 0660 - 改完必须重启 PHP-FPM:
sudo systemctl restart php8.2-fpm(reload 不生效)
排查 Xdebug 或 request_terminate_timeout 导致的“假死”连接
本地开发开 Xdebug 后,单步调试耗时长,PHP-FPM 可能等不及就 kill 掉 worker,Nginx 收到 “Connection reset by peer”,立刻返回 502——现象像服务崩了,其实是超时机制在作祟。
- 查 PHP-FPM 超时设置:
sudo cat /etc/php/8.2/fpm/pool.d/www.conf | grep request_terminate_timeout - 若值是
30s或更小,Xdebug 下极易触发;临时调高:request_terminate_timeout = 300(5 分钟) - 别只调这个:还要同步检查
request_slowlog_timeout和slowlog路径是否可写,否则慢日志写不进,问题难复现 - 如果只是本地调试,建议在
php.ini里关掉 Xdebug 的自动启动:xdebug.start_with_request = off,需要时再手动开启
最容易被忽略的点是:错误日志里出现 Connection reset by peer 时,90% 不是 Nginx 配错了,而是 PHP-FPM worker 被强制终止了——这时候光重启 Nginx 没用,得盯紧 /var/log/php8.2-fpm.log 里的 WARNING 或 ERROR 行,尤其是 “seems busy”、“max children reached” 这类提示,它们才是真正的问题源头。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











