PHP7.4-FPM搭配Nginx访问状态页时出现“Primary script unknown”错误求助
你遇到的这个问题我之前维护老版本PHP服务器时也碰到过,结合你说的“相同配置在PHP8.2服务器正常”的情况,核心原因大概率是Nginx把状态页请求当成了普通PHP文件请求,或者PHP-FPM的状态配置没正确开启。给你几个针对性的排查和解决方向:
1. 给状态页请求单独配置Nginx Location块
如果你的Nginx里没有专门处理/status/show、/status/ping的规则,这类请求会被普通的PHP文件匹配规则(比如location ~ \.php$)接管,Nginx会去服务器上查找对应的物理脚本文件(比如$document_root/status/show.php),自然找不到就抛出“Primary script unknown”错误。
你需要在Nginx配置里添加一个优先级更高的Location块,专门处理状态请求:
location ~ ^/status/(show|ping)$ { fastcgi_pass unix:/usr/local/php74/sockets/domain.com; # 关键:告诉PHP-FPM这是状态查询请求,不需要找实际脚本 fastcgi_param SCRIPT_NAME /status; fastcgi_param SCRIPT_FILENAME /status; include fastcgi_params; # 可选:添加IP限制,避免公开访问状态页 allow 15.16.2.54; # 你的客户端IP allow 127.0.0.1; deny all; }
注意这个块要放在普通PHP文件的Location之前,确保先被匹配到。
2. 确认PHP-FPM Pool开启了状态页功能
检查你PHP7.4服务器上的[domain.com] pool配置文件,确保存在开启状态页的参数:
pm.status_path = /status
这个参数是PHP-FPM识别状态请求的核心,如果遗漏或者路径写错,PHP-FPM就无法响应/status/xxx的请求。配置完成后记得重启PHP-FPM服务:
service php-fpm74 restart
3. 排查Socket权限与进程用户一致性
虽然你说配置和另一台服务器一致,但还是要核对以下几点:
- 用
ps aux | grep php-fpm确认PHP-FPM进程运行的用户是www(和pool配置里的user/group一致) - 用
ps aux | grep nginx确认Nginx进程运行的用户也是www,这样Nginx才能正常读取/usr/local/php74/sockets/domain.com这个socket文件 - 用
ls -l /usr/local/php74/sockets/domain.com检查socket文件的权限是否为www:www
4. 验证fastcgi_params的参数覆盖问题
有些服务器的fastcgi_params文件里默认配置了SCRIPT_FILENAME,可能会覆盖你在Location里的设置。你可以把fastcgi_param SCRIPT_NAME和fastcgi_param SCRIPT_FILENAME放在include fastcgi_params;之后,确保它们的优先级更高。
备注:内容来源于stack exchange,提问作者Nick

