502错误通常因PHP-FPM服务宕机或配置不匹配导致,需依次检查服务状态、监听配置一致性、进程与权限、直连响应及状态页指标。
如果访问网站时返回502 Bad Gateway错误,通常表明Nginx已接收到请求,但无法成功将请求转发给PHP-FPM处理。以下是排查PHP-FPM服务是否宕机的具体操作步骤:
一、检查PHP-FPM服务运行状态
该步骤用于确认PHP-FPM主进程是否处于活动状态。若服务未启动或异常退出,Nginx将因无法连接FastCGI后端而返回502错误。
1、通过SSH登录服务器,执行命令查看当前PHP版本对应的服务状态:
systemctl statusphp-fpm-74
(若使用PHP 8.0则替换为
,依此类推)。
2、观察输出中是否包含
字样;若显示
或
,说明服务未运行。
立即学习
“
PHP免费学习笔记(深入)
”;
3、若服务未运行,尝试手动启动:
systemctl start php-fpm-74
,再执行
验证结果。
二、验证PHP-FPM监听配置与Nginx一致性
该步骤用于排除因监听地址或端口不匹配导致的通信失败。Nginx的
必须与PHP-FPM的
参数完全一致,否则请求无法送达。
1、打开PHP-FPM配置文件:
/www/server/php/74/etc/php-fpm.d/www.conf
(路径中的
需按实际PHP版本调整)。
2、查找
行,确认其值为
或
等具体地址。
3、进入宝塔面板 → 网站 → 对应站点 → 设置 → 配置文件,搜索
,确保其值与上一步获取的
值严格一致。
4、修改后执行
校验语法,再运行
重载配置。
三、检查PHP-FPM进程是否存在及权限状态
该步骤用于识别进程被意外终止、权限不足或SELinux/firewalld干扰等底层问题。即使服务显示“active”,也可能因子进程崩溃或socket不可达而失效。
1、执行命令列出所有PHP-FPM进程:
ps aux | grep php-fpm
,确认存在master进程和若干worker进程。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
2、若仅剩master进程且无worker,或完全无输出,说明FPM未能正常派生子进程。
3、检查socket文件或端口权限:若使用Unix socket(如
),运行
,确认属主为
或
,且Nginx工作进程用户有读写权限。
4、若使用TCP端口(如
),执行
,确认PHP-FPM正在监听且无其他程序占用该端口。
四、利用curl直接测试PHP-FPM响应能力
该步骤绕过Nginx,直接向PHP-FPM发送HTTP头请求,可精准判断是Nginx层故障还是PHP-FPM自身无响应。
1、在服务器本地执行:
curl -I http://localhost
,若返回
或类似成功响应,说明PHP-FPM正常工作;若超时或返回空,表明PHP-FPM未响应。
2、若使用socket方式,可改用
(需curl 7.40+支持)。
3、若上述任一测试失败,立即检查
末尾日志,定位
或
记录。
五、启用并访问PHP-FPM状态页进行深度诊断
该步骤借助PHP-FPM内置的状态监控接口,实时获取进程池健康度、队列积压、慢请求等关键指标,辅助识别隐性资源瓶颈。
1、编辑
,取消注释或添加:
pm.status_path = /phpfpm_status
。
2、在Nginx站点配置中添加location块(位于server段内):
3、执行
使配置生效。
4、在服务器本地执行:
curl http://127.0.0.1/phpfpm_status?json
,检查返回中
、
、
等字段数值是否异常。
php-fpm-80active (running)inactive (dead)failed to startsystemctl status php-fpm-74fastcgi_passlisten74listen =127.0.0.1:9000/tmp/php-cgi-74.sockfastcgi_passlistennginx -tsystemctl reload nginx/tmp/php-cgi-74.sockls -l /tmp/php-cgi-74.socknobodywww127.0.0.1:9000netstat -tlnp | grep :9000HTTP/1.1 200 OKcurl --unix-socket /tmp/php-cgi-74.sock http://localhost/www/server/php/74/var/log/php-fpm.logERRORWARNING/www/server/php/74/etc/php-fpm.conflocation /phpfpm_status {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
}nginx -t && systemctl reload nginx && systemctl reload php-fpm-74active processeslisten queuemax children reached