必须从laravel.log开始看,因为它是唯一记录具体错误类型、文件路径、行号及堆栈的源头日志;nginx/php-fpm仅提示“出错”,不提供代码级线索;若该文件不存在或不可写,则错误无法记录,导致500页面空泛无信息。

先查 storage/logs/laravel.log,不是 Nginx 错误日志,也不是 PHP-FPM 日志,是 Laravel 自己的日志。
为什么必须从 laravel.log 开始看
500 错误是“兜底错误”,Nginx 或 PHP-FPM 只会记录“出错了”,但不会告诉你哪行 PHP 代码崩了、哪个配置项写错了、哪张表不存在。真正带堆栈、带变量、带上下文的线索,全在 laravel.log 里。
- 如果
storage/logs/目录不存在或不可写,Laravel 就连日志都写不进去,此时你会看到一个空的 500 页面,laravel.log文件为空或根本没生成 - 如果
APP_DEBUG=false(尤其线上环境),laravel.log仍会记录完整错误,但浏览器只显示通用 500 —— 所以别依赖页面提示,直接翻文件 - 日志里第一行通常是异常类名,比如
Illuminate\Database\QueryException或Symfony\Component\Debug\Exception\FatalThrowableError,这是定位问题类型的最快依据
storage 和 bootstrap/cache 权限不对的典型表现
权限问题不会直接报“权限拒绝”,而是表现为:日志写不进、缓存读不了、配置加载失败,最终统一抛出 500。
-
storage/目录权限不是 775 就可能出事:Laravel 要往storage/logs/写日志、往storage/framework/views/写编译模板、往storage/framework/cache/存缓存 -
bootstrap/cache/如果不可写,php artisan config:cache会失败,后续所有请求都会因找不到缓存配置而报错 - 用宝塔面板改权限时,务必确认用户组是
www(Nginx/PHP 运行用户),不能只改数字权限却留错用户组
.env 文件缺失或语法错误会静默触发 500
Laravel 启动时会尝试加载 .env,一旦解析失败(比如漏了引号、多了等号、用了中文冒号),就会中断启动流程,且不输出具体错误。
- 检查
.env是否真实存在于项目根目录(不是.env.example) - 运行
php artisan tinker,输入env('APP_NAME')—— 如果返回null或报错,说明.env没加载成功 - 常见低级错误:
DB_PASSWORD=123456#注释(# 后面被当注释,密码实际是空)、APP_URL=http://example.com/末尾多斜杠(某些扩展会因此解析失败)
PHP 扩展缺失往往只报 500,不报具体缺谁
Laravel 启动早期就依赖 json、mbstring、openssl 等扩展。少一个,框架初始化就卡住,直接 500。
- 在服务器上执行
php -m | grep -E 'json|mbstring|openssl|pdo|tokenizer',确认这些模块已启用 - 特别注意:宝塔面板里装了 PHP,不代表当前网站用的就是那个版本 —— 检查站点设置中“PHP 版本”是否和你查的
php -v一致 - 如果用的是 PHP 8.5+,
ext-fileinfo是 laravel-admin 等后台包的硬性依赖,漏掉也会 500
最常被跳过的其实是日志文件本身是否存在、是否可写。很多人翻了半天 Nginx 配置,最后发现 storage/logs 目录属主是 root,PHP 进程根本没权限创建文件 —— 错误没记下来,排查就永远在黑盒里转圈。











