LNMP环境下ThinkPHP5首页报500,主因是open_basedir限制跨目录加载,需检查并修改fastcgi.conf中open_basedir配置、.user.ini路径设置及Nginx root指向public目录,同时启用display_errors确认真实错误。

LNMP 环境下 ThinkPHP5 域名绑定后首页报错 500,八成是 open_basedir 拦住了跨目录加载,不是代码问题,也不是域名没绑对。
检查 Nginx 配置里的 open_basedir 是否锁死了路径
ThinkPHP5 的入口在 public/,但核心文件(如 thinkphp/base.php)在上级目录。LNMP 默认的 open_basedir 只放行 $document_root/(即 public/),导致 require 上级文件时直接 Permission denied。
- 查
/usr/local/nginx/conf/fastcgi.conf,找这行:fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; - 把它注释掉(前面加
#)或删掉 - 如果用了
.user.ini,也打开它(通常在项目根目录),把open_basedir=...这行删掉或改成包含整个项目路径,比如:open_basedir=/home/wwwroot/yourdomain.com/:/tmp/:/proc/ - 改完必须执行
lnmp nginx reload或nginx -s reload
确认网站根目录是否真的指向 public/
域名绑定了,但 Nginx 的 root 如果还指在项目根目录(比如 /home/wwwroot/yourdomain.com),而不是 /home/wwwroot/yourdomain.com/public,就会触发路由和自动加载双重失败。
- 进
/usr/local/nginx/conf/vhost/yourdomain.com.conf - 确认
root指向的是.../public,不是项目根 - 同时检查
location ~ \.php$块里的fastcgi_param SCRIPT_FILENAME,它必须是$document_root$fastcgi_script_name,不能硬写死路径 - 宝塔用户:站点设置 → 「网站目录」→ 「运行目录」必须选
/public(下拉选择,别手输)
临时让错误显示出来,别猜
500 页面空白,不代表没报错——只是被静音了。不打开错误,你永远不知道第一行错在哪。
立即学习“PHP免费学习笔记(深入)”;
- 打开
public/index.php,在<?php后第一行插入:ini_set('display_errors', '1'); error_reporting(E_ALL); - 确保这行在
require __DIR__ . '/../vendor/autoload.php';之前 - 如果仍不显示,检查 PHP-FPM 配置(如
/etc/php/*/fpm/pool.d/www.conf),加上:php_flag[display_errors] = on,然后lnmp php-fpm restart - 顺手清空
runtime/:rm -rf runtime/*,避免旧缓存干扰
权限和日志必须连着看
mkdir(): Permission denied 或 failed to open stream: Permission denied 这类报错,90% 是 runtime/ 目录属主或权限不对,或者 open_basedir 把 /tmp/ 也锁死了。
- 执行
ls -ld runtime runtime/log,确认输出里有www或www-data(LNMP 默认用www用户) - 如果不是,运行:
chown -R www:www runtime/(注意不是www-data) - 检查
open_basedir设置里是否含/tmp/—— 缺了它,runtime/下的临时文件也写不了 - 打开
config/app.php,确认'log' => ['record' => true]已启用,否则日志根本不会落盘
真正卡住的地方往往不是框架本身,而是 open_basedir 和 root 路径这两个配置项之间差了一个斜杠或一级目录。改完别急着刷新,先 tail -f /home/wwwlogs/yourdomain.com_error.log 看实时错误,比猜快十倍。



















