502错误本质是nginx无法连接php-fpm,需依次检查:服务状态、socket/端口配置一致性、文件权限、进程管理参数及多版本独立性。

502 错误直接指向 PHP-FPM 没响应
宝塔面板显示 502,基本就是 Nginx 转发请求时连不上 php-fpm。不是网站代码问题,也不是数据库挂了,而是 PHP 进程根本没在听——要么没启动,要么启动了但监听地址/端口不匹配,要么被系统 kill 掉了。
先确认状态:systemctl status php-fpm-81(版本号按你实际用的填,比如 php-fpm-74);如果显示 inactive (dead) 或 failed,说明进程根本没跑起来。
- 常见错误现象:
connect() to unix:/tmp/php-cgi-81.sock failed或Connection refused—— 这类日志一定出现在/www/wwwlogs/nginx_error.log里 - 别盲目重启:如果
php-fpm启动失败,重启只是重复失败,得先看日志:journalctl -u php-fpm-81 -n 50 --no-pager - 检查配置路径是否被宝塔改写:宝塔会把主配置指向
/www/server/php/81/etc/php-fpm.conf,但实际生效的是它 include 的www.conf,重点看里面的listen和listen.owner
listen 配置错一个字符就 502
php-fpm 必须和 Nginx 的 fastcgi_pass 对上,否则 Nginx 找不到“门”。宝塔默认用 socket 文件(如 /tmp/php-cgi-81.sock),但很多人手动改过配置,或升级后残留旧设置,导致两边“约好了地点却没碰上”。
- 查 PHP-FPM 监听方式:
grep "^listen =" /www/server/php/81/etc/php-fpm.d/www.conf,输出应为listen = /tmp/php-cgi-81.sock或listen = 127.0.0.1:9000 - 查 Nginx 配置:
grep "fastcgi_pass" /www/server/panel/vhost/nginx/你的域名.conf,必须和上面的 listen 完全一致(路径、IP、端口、权限都要对) - socket 文件权限容易被忽略:如果
listen.owner = www且listen.group = www,那/tmp/php-cgi-81.sock文件属主必须是www用户,否则 Nginx(运行在www用户下)无法连接 - 用
ls -l /tmp/php-cgi-81.sock看权限;不对就手动删掉 sock 文件,再systemctl restart php-fpm-81让它重建
进程管理器(pm)设太激进,PHP 自己把自己干掉了
宝塔默认用 pm = dynamic,但如果 pm.max_children 设太高,或 pm.start_servers 太低,会导致高并发时子进程频繁启停,或者内存爆掉后被系统 OOM killer 杀掉——现象就是 PHP-FPM 看似在运行,但 ps aux | grep php-fpm 里 worker 进程数为 0,或者秒起秒死。
- 典型症状:
php-fpm状态显示 active,但curl -I http://localhost返回 502;journalctl里有Out of memory: Kill process - 检查当前负载:
free -h和ps aux --sort=-%mem | head -5,看 PHP 是否吃光内存 - 调整建议(以 2G 内存机器为例):
pm = dynamicpm.max_children = 10pm.start_servers = 3pm.min_spare_servers = 2pm.max_spare_servers = 5pm.max_requests = 500(防内存泄漏) - 改完必须重载:
systemctl reload php-fpm-81(不是 restart),否则配置不生效
宝塔界面操作 vs 手动命令,哪个更可靠?
宝塔点“重启 PHP”按钮,背后执行的是 systemctl restart php-fpm-xx,看起来没问题——但如果你改过 php-fpm.conf 或 www.conf,而宝塔没刷新缓存,或者配置语法有错,它只会静默失败。
- 真实排障顺序应该是:
① 命令行查状态:systemctl status php-fpm-81
② 查错误日志:journalctl -u php-fpm-81 -n 30
③ 手动测试配置:/www/server/php/81/bin/php-fpm -t -c /www/server/php/81/etc/php.ini -y /www/server/php/81/etc/php-fpm.conf
④ 确认无误再 reload - 宝塔的“配置修改”页面有时不会同步到所有字段(比如
pm.max_requests在新版宝塔里默认不显示),靠界面改容易漏项 - 最易被忽略的点:多个 PHP 版本共存时,
php-fpm-74和php-fpm-81是两个独立服务,改了一个的配置,另一个完全不受影响——别以为调好 81 就万事大吉
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











