Laravel生产环境必须用Nginx/Apache+PHP-FPM,入口指向public/;需PHP≥8.1及mbstring、openssl、pdo_mysql等扩展;权限设chown -R www-data:www-data storage bootstrap/cache;Nginx必配try_files和fastcgi_param;.env须设APP_ENV=production、APP_DEBUG=false并执行config:cache。

别直接把 Laravel 项目扔进 Web 根目录,也别用 php artisan serve 上线——它只适合本地调试,生产环境必须走 Nginx/Apache + PHP-FPM,且入口只能是 public/ 目录。
PHP 版本和扩展不匹配,Class 'Illuminate\Foundation\Application' not found 就会立刻报
这不是代码问题,是环境没对齐。Laravel 10+ 明确要求 PHP ≥ 8.1,而服务器装了 8.0 或 7.4,composer install 表面成功,但运行时自动加载器根本解析不了新语法或类结构。
- 执行
php -v确认版本,不是看宝塔面板显示的“已安装”,要看终端里真实输出 - 必需扩展一个不能少:
mbstring、openssl、pdo_mysql、tokenizer、xml、ctype、json——用php -m | grep -E 'mbstring|openssl|pdo'实际检查 -
ext-opcache要启用,否则config:cache和route:cache会失败或无效 - 宝塔用户请进「PHP 管理」→「安装扩展」手动勾选,改完必须重启 PHP-FPM,光点保存没用
500 错误但没日志?先盯 <code>storage/ 和 bootstrap/cache/ 权限
Laravel 启动时要往这两个目录写缓存文件,如果 Web 进程(如 www-data 或 nginx)没写权限,config:cache 会静默失败,后续所有配置读取都走默认值,数据库连不上、密钥失效、路由找不到全由此引发。
- 别用
chmod 777,这是安全漏洞。正确做法是:chown -R www-data:www-data storage bootstrap/cache(用户组按你服务器实际 Web 进程用户调整) - 确认目录本身可写,也要确认父目录有执行权限(
755),否则opendir()会失败 - 如果用了 symlink 部署(比如
current → releases/20260420),chown必须作用于真实路径,软链本身设权限没意义 - 查不到错误?直接看 PHP 错误日志:
/var/log/php-fpm/www-error.log(Nginx)或/var/log/apache2/error.log(Apache)
Nginx 配置漏掉这三行,/login 就 404,只有 /index.php/login 能通
伪静态不是锦上添花,是 Laravel 路由生效的前提。网上抄的配置常删掉关键转发逻辑,导致干净 URL 全部 404。
-
try_files $uri $uri/ /index.php?$query_string;必须写在location /块里,缺了它,Nginx 不知道该把请求转给谁 -
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;一定要用$realpath_root,不是$document_root;否则遇到软链部署,$_SERVER['SCRIPT_FILENAME']指向的是软链路径,Laravel 自动检测就崩 -
fastcgi_split_path_info ^(.+\.php)(/.+)$;必须存在,否则带 PATH_INFO 的 API 请求(比如/api/v1/users/123)会被错送到index.php外的脚本 - 宝塔用户别信“伪静态选 Laravel 5”就万事大吉——进去看生成的配置,这三行有没有被覆盖或删掉
.env 改错一行,整个应用就白屏或泄露密码
.env 是生产环境最脆弱的一环。APP_ENV=local 或 APP_DEBUG=true 没关,500 错误会直接吐出数据库密码;DB_HOST 留空或写错,config:cache 会静默失败,缓存文件里全是 null,后续全崩。
-
APP_ENV必须为production,否则中间件、服务提供者加载逻辑走岔路,config:cache不生效 -
APP_DEBUG必须为false,否则任何异常都暴露完整堆栈,API 接口变信息泄露接口 -
DB_HOST、DB_DATABASE、DB_USERNAME、DB_PASSWORD必须填真实值,不能留空、不能是localhost(Docker 或远程 DB 场景下尤其注意) - 上传后第一件事不是访问首页,而是跑:
php artisan config:clear && php artisan config:cache——旧缓存不清理,新.env值根本不会被读取
最常被跳过的其实是 composer install --no-dev --optimize-autoloader 和 php artisan route:cache:前者漏掉 --no-dev 可能意外装上 laravel-debugbar,后者没跑会导致每次请求都重新解析全部路由,性能差还容易因命名空间拼写错误当场 404。


















