配置PHP-FPM status页后返回空内容,如何排查解决?
排查PHP-FPM状态页返回空内容的步骤
这种情况我之前踩过不少坑,给你按优先级整理几个排查方向,基本能解决问题:
1. 先确认PHP-FPM的状态页配置是否真的生效
- 首先检查对应站点使用的PHP-FPM池的配置文件(比如
/etc/php/7.4/fpm/pool.d/www.conf),确保确实存在pm.status_path = /status这一行,别改错了池(比如改了default池但站点用的是www池)。 - 改完配置后必须重启PHP-FPM服务,执行对应的命令:
# Systemd环境 systemctl restart php-fpm # 或者指定版本 systemctl restart php7.4-fpm # SysVinit环境 service php-fpm restart - 检查PHP-FPM的访问控制:如果是TCP监听(比如
listen = 127.0.0.1:9000),要确保listen.allowed_clients = 127.0.0.1(允许本地访问);如果是Unix Socket,这个参数不生效,但要确保Socket的权限正确(比如属主是www-data:www-data,Nginx进程有权限读写)。 - 重点排查security.limit_extensions:这个参数默认只允许处理带.php后缀的文件,而/status没有后缀,会被拦截!解决方法是在pool配置里修改:
改完必须重启PHP-FPM。# 要么添加允许的后缀(生产环境推荐) security.limit_extensions = .php .php3 .php4 .php5 .php7 # 或者完全放开(仅测试用) security.limit_extensions =
2. 检查Nginx的转发配置是否正确
- 必须用精确匹配的location块处理/status请求,避免被其他优先级更高的location(比如
location ~ \.php$)拦截,配置示例:
这里的核心是location = /status { # 替换成你的PHP-FPM Socket或TCP地址 fastcgi_pass unix:/run/php/php-fpm.sock; # 关键:必须设为$fastcgi_script_name,而非$document_root$fastcgi_script_name fastcgi_param SCRIPT_FILENAME $fastcgi_script_name; include fastcgi_params; }SCRIPT_FILENAME参数,因为/status不是真实存在的文件,PHP-FPM是通过这个参数识别要返回状态页的,如果设成了带文档根的路径,会出现“Primary script unknown”的错误,导致返回空内容。 - 改完Nginx配置后要重载配置:
nginx -s reload,并先验证配置合法性:nginx -t。
3. 直接测试PHP-FPM的状态页(跳过Nginx)
用cgi-fcgi工具直接连接PHP-FPM,验证状态页本身是否能正常返回内容:
# Unix Socket方式 SCRIPT_NAME=/status SCRIPT_FILENAME=/status QUERY_STRING= REQUEST_METHOD=GET cgi-fcgi -bind -connect /run/php/php-fpm.sock # TCP方式 SCRIPT_NAME=/status SCRIPT_FILENAME=/status QUERY_STRING= REQUEST_METHOD=GET cgi-fcgi -bind -connect 127.0.0.1:9000
如果这个命令能返回正常的状态内容(比如包含pool:、processes:等字段),说明问题出在Nginx配置;如果还是空的,那肯定是PHP-FPM的配置或权限问题,回到第一步重新排查。
4. 查看日志定位问题
- 查看Nginx的错误日志(比如
/var/log/nginx/error.log),如果有“Primary script unknown”的错误,就是SCRIPT_FILENAME配置错了。 - 查看PHP-FPM的错误日志(比如
/var/log/php-fpm/error.log),如果有“Access to the script '/status' has been denied (security.limit_extensions)”的错误,就是security.limit_extensions的问题。
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

