必须在web/index.php开头加error_reporting(e_all); ini_set('display_errors', '1');并确保nginx未启用fastcgi_intercept_errors、php-fpm未禁用display_errors、php.ini中display_errors=on且error_reporting=e_all,否则500错误将被静默吞掉。

直接看PHP真实错误而不是500空白页
Yii2在Nginx下默认不显示PHP错误,只返回空白500,根本没法定位问题。必须让错误浮出来——不是改Yii配置,而是绕过Nginx的错误拦截和PHP的静默机制。
在 web/index.php 开头插入两行(紧贴第一行 defined('YII_DEBUG')... 后面):
error_reporting(E_ALL);
ini_set('display_errors', '1');
同时确认 php.ini 中 display_errors = On 且 error_reporting = E_ALL,否则Nginx + PHP-FPM组合会吞掉致命错误。
常见失效场景:
- Nginx配置了
fastcgi_intercept_errors on;—— 必须改为off,否则它会把PHP错误转成自定义50x页面 - 宝塔面板启用了「防跨站攻击」或
.user.ini限制 —— 该文件会覆盖display_errors设置,需先chattr -i .user.ini再删 - PHP-FPM pool配置中设置了
php_flag[display_errors] = off—— 要检查/www/server/php/xx/etc/php-fpm.d/www.conf对应段落
用 nginx -t 检查配置语法是否合法
nginx -t 是唯一能快速验证Nginx配置是否“写错”的命令,但它不检查逻辑是否适配Yii2——比如漏 $args 或路径写错,nginx -t 仍会显示 syntax is ok,但请求一发就500。
执行前先确认你测的是正在加载的配置:
- 运行
ps aux | grep nginx,看主进程是否带-c参数;若有,对那个路径执行nginx -t - 若没带
-c,用nginx -V 2>&1 | grep "conf-path"找到实际主配置路径 - 重点检查
include的子配置(如站点conf)是否存在、路径是否拼错、有无中文字符或BOM头
典型报错如 unknown directive "location",大概率是配置文件用了UTF-8 with BOM编码,用编辑器另存为UTF-8无BOM即可。
查 error.log 看PHP层具体失败点
500错误真正源头几乎都在PHP层,Nginx日志(/www/wwwroot/your-site/log/error.log 或 /www/wwwlogs/your-site.error.log)里会记录真实线索,例如:
PHP message: PHP Warning: realpath(): open_basedir restriction in effect. File(/www/wwwroot/your-site/common) is not within the allowed path(s)
这说明 open_basedir 限制太死,Yii2加载类时访问了vendor或common目录,但这些路径不在白名单里。解决方法是修改对应站点的PHP设置,把 /www/wwwroot/your-site 整个路径加进 open_basedir,而非只写 /web 子目录。
其他高频线索:
-
Failed opening required '/www/wwwroot/your-site/config/web.php'→ 根目录没设对,还是指向项目根而非/web -
Primary script unknown→fastcgi_param SCRIPT_FILENAME路径拼错了,常见于没写$realpath_root或漏fastcgi_split_path_info -
connect() to unix:/tmp/php-cgi.sock failed→ PHP-FPM没启动,或sock路径与配置不一致
确认 fastcgi_pass 是否指向有效PHP-FPM实例
502 Bad Gateway 和 500 混淆很常见:前者是Nginx压根连不上PHP处理进程,后者才是PHP自己崩了。如果浏览器刷新几次偶尔通、偶尔500,大概率是 fastcgi_pass 配错了端口或socket路径。
查PHP-FPM实际监听方式:
- 宝塔用户:进「软件商店」→ 找当前PHP版本 → 「设置」→ 「配置修改」→ 看「监听地址」,通常是
127.0.0.1:9000或unix:/tmp/php-cgi-74.sock - 手动部署:查
php-fpm.conf或 pool conf 中listen =行
然后核对Nginx站点配置中的 fastcgi_pass 值是否完全一致,注意末尾不能多空格、不能写错协议(unix: 前缀不能丢)。
验证方式:在终端执行 curl -I http://127.0.0.1:9000(若走TCP)或 ls -l /tmp/php-cgi*.sock(若走Unix socket),确保目标可达。











