PHP-FPM监听状态与Apache配置不匹配是502/503主因,需依次验证:ss命令查实际监听(TCP/socket)、ps确认唯一PHP版本进程、宝塔重启强制刷新、Apache配置中fcgi://路径与www.conf的listen值及socket权限(属主/SELinux)完全一致,并用cgi-fcgi和curl分层验证链路。
确认PHP-FPM实际监听状态是否匹配配置
apache重载后网站报502/503,常见原因是php-fpm未真正切换到新版本或新socket路径。先检查php-fpm当前监听地址:
运行 sudo ss -tuln | grep ':9000\|php.*sock',确认监听的是tcp端口还是unix socket;再对比apache虚拟主机中fcgi://unix:或fcgi://127.0.0.1:9000是否与之完全一致。
特别注意:宝塔升级php版本后,/var/run/php/php8.1-fpm.sock可能已创建,但旧进程仍在监听php7.4-fpm.sock,而apache配置未更新。
验证PHP-FPM进程池是否已重启且唯一
重载Apache不会自动重启PHP-FPM,必须手动同步。执行:
ps aux | grep 'php-fpm:',观察输出中是否只存在你当前启用的PHP版本(如php8.1-fpm)的master进程;
若同时看到php7.4-fpm和php8.1-fpm的master进程,说明旧进程残留,需kill -9掉旧PID;
进入宝塔「软件管理」→ 找到对应PHP版本 → 点击「设置」→「服务」→ 先「停止」再「启动」,确保强制刷新进程池与socket文件。
检查Apache配置中PHP路径映射是否生效
即使PHP-FPM已重启,Apache仍可能因配置残留转发失败:
查看虚拟主机配置,确认没有遗留AddHandler application/x-httpd-php .php等模块式配置(会冲突);
重点检查RewriteRule或ProxyPassMatch中fcgi://unix:后的socket路径,是否与www.conf中listen = 值完全一致;
验证listen.owner和listen.group(如www-data)是否与Apache工作用户匹配,用ls -l /var/run/php/*.sock核对权限;
SELinux启用时,还需运行getsebool httpd_can_network_connect,若为off则执行setsebool -P httpd_can_network_connect 1。
快速验证连接通路是否打通
绕过Apache直连PHP-FPM,确认底层链路正常:
新建测试脚本/tmp/test.php,内容为<?php echo 'OK'; ?>;
执行SCRIPT_FILENAME=/tmp/test.php REQUEST_METHOD=GET cgi-fcgi -bind -connect /var/run/php/php8.1-fpm.sock(路径按实际替换);
若返回OK,说明PHP-FPM本身可用;若报错connect failed或Permission denied,问题在socket权限或路径;
再用curl -v http://localhost/test.php测试全链路,结合Apache error_log定位具体失败环节。



















