Nginx 下 PHP 页面显示空白怎么办?
Nginx + PHP-FPM 页面空白的排查:PHP 错误未显示(display_errors)、SCRIPT_FILENAME 路径错、PHP-FPM 未运行、error_reporting 配置;附快速开启错误显示与 FAQ。
PHP 空白页可能来自隐藏的致命错误,也可能是应用正常返回空内容或代理配置问题。 先检查 HTTP 状态码、响应体和 PHP-FPM/Nginx 日志;display_errors 只在受控开发环境临时开启。
第一步:让错误显示出来
方法一(改 PHP 配置):编辑 PHP 的 php.ini(注意 FPM 那份,不是 CLI):
display_errors = On
error_reporting = E_ALL
systemctl restart php*-fpm 后在受控开发环境验证;并非所有故障都能显示为 PHP 报错。
方法二(仅受控开发环境;同文件解析错误发生时以下代码无法执行):在入口文件顶部加:
<?php
ini_set('display_errors', '1');
error_reporting(E_ALL);
方法三(看日志,生产推荐):
tail -f /var/log/php*-fpm/error.log # FPM 自身日志
tail -f /var/log/nginx/error.log # Nginx 侧
# PHP 的 error_log 位置由 php.ini 的 error_log 指定
高频根因清单
错误现形后按图索骥;没现形前可先看这几个:
- PHP-FPM 没在跑:
systemctl status php*-fpm;没在跑时 Nginx 通常 502 而非空白,但部分配置下会出空白。 - SCRIPT_FILENAME 路径错:Nginx 配置里
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;——如果root指错,PHP-FPM 拿到的路径不存在,可能返回 File not found/404 或经错误页配置改变的响应,并非必然空白。用nginx -T核对 root,再ls确认文件真在。 - 内存耗尽:
Fatal error: Allowed memory size exhausted——调大memory_limit,并查是哪个操作吃的。 - 扩展缺失:代码用到
mysqli/gd/curl而 FPM 环境没装对应扩展(CLI 装了不代表 FPM 装了)。 - 权限:PHP 要读的文件/要写的目录对 FPM 用户不可达。
修完后:把 display_errors 关回去
display_errors = On 只适合受控开发环境,不应向生产访客暴露。生产环境正确姿势是 display_errors = Off + log_errors = On + 明确 error_log 路径——错误进日志,不给用户看堆栈(堆栈里的路径和代码细节是攻击者的情报)。
多台 PHP-FPM 实例可通过观测云 DataKit 文件日志采集集中收集上述 error_log。关闭页面报错后再触发一次可控错误,确认记录包含时间、主机和应用信息,避免仅关闭展示却没有留下排障依据。
常见问题(FAQ)
Q:错误日志里也是空的?
A:确认查的是 FPM 的 php.ini(php -r "echo php_ini_loaded_file();" 查的是 CLI 的,别混);再看 log_errors 是否 On、error_log 路径是否存在可写。
Q:只有某些页面空白,首页正常?
A:说明框架引导正常、是特定控制器/模板炸了。按时间戳检查错误日志和应用路径;日志缺失、正常空响应或进程终止都可能没有对应 PHP 报错。
Q:静态文件正常、所有 PHP 都空白?
A:重点查 fastcgi 配置——SCRIPT_FILENAME 路径错误会让所有 PHP 请求拿到找不到脚本的错误响应,其状态与正文取决于配置。