Nginx 下 PHP 页面显示空白怎么办?

Nginx + PHP-FPM 页面空白的排查:PHP 错误未显示(display_errors)、SCRIPT_FILENAME 路径错、PHP-FPM 未运行、error_reporting 配置;附快速开启错误显示与 FAQ。

最佳实践
Nginx 下 PHP 页面显示空白怎么办?封面

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 指定

高频根因清单

错误现形后按图索骥;没现形前可先看这几个:

  1. PHP-FPM 没在跑:systemctl status php*-fpm;没在跑时 Nginx 通常 502 而非空白,但部分配置下会出空白。
  2. SCRIPT_FILENAME 路径错:Nginx 配置里 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;——如果 root 指错,PHP-FPM 拿到的路径不存在,可能返回 File not found/404 或经错误页配置改变的响应,并非必然空白。用 nginx -T 核对 root,再 ls 确认文件真在。
  3. 内存耗尽:Fatal error: Allowed memory size exhausted——调大 memory_limit,并查是哪个操作吃的。
  4. 扩展缺失:代码用到 mysqli/gd/curl 而 FPM 环境没装对应扩展(CLI 装了不代表 FPM 装了)。
  5. 权限: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 请求拿到找不到脚本的错误响应,其状态与正文取决于配置。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台