生产环境Laravel上线必须执行php artisan migrate --force并设置APP_DEBUG=false,否则存在高危风险;同时需确保.env中明确配置APP_ENV=production、APP_DEBUG=false、APP_URL,且部署时使用composer install --no-dev --optimize-autoloader,Nginx根目录指向public/并正确配置try_files $uri $uri/ /index.php?$query_string;。

php artisan migrate --force 必须加,否则生产环境会拒绝执行迁移;APP_DEBUG=false 必须设,否则报错堆栈直接暴露在页面上——这两点不满足,上线即高危。
env 配置和 APP_ENV=production 的实际影响
不是改个 APP_ENV=production 就算“上线”了。APP_ENV 会连锁触发框架行为变更:
-
config:cache只在production下允许运行,且一旦缓存,.env的后续修改将完全失效 -
APP_DEBUG=true在 production 环境下会被 Laravel 强制忽略,但若没设APP_DEBUG=false,部分中间件或异常处理器仍可能回退到调试模式 - 日志通道默认切到
stack+daily,但若LOG_CHANNEL没显式配成single或stderr,可能写满磁盘
务必手动确认 .env 中这三行已存在且值明确:
APP_ENV=production APP_DEBUG=false APP_URL=https://yourdomain.com
漏掉任意一项,都可能让应用在 500 错误和空白页之间反复横跳。
composer install --no-dev --optimize-autoloader 的必要性
开发时用的 phpunit、laravel/pint、barryvdh/laravel-debugbar 这类包,在生产环境不仅无用,还会增加攻击面和内存开销。
执行时必须带这两个参数:
-
--no-dev:跳过require-dev里所有包(包括自动加载器中的 dev 类) -
--optimize-autoloader:生成扁平化类映射(vendor/composer/autoload_classmap.php),减少文件系统 stat 调用,提升响应速度
如果只跑 composer install,debugbar 可能悄悄启动并监听请求,导致 CPU 持续飙高;而漏掉优化参数,Autoloader 在高并发下会多出 10%~15% 的 I/O 延迟。
Nginx 配置中 public/ 目录和 try_files 的坑
Web 根目录必须指向 public/,而不是项目根目录。否则 .env、app/、config/ 全部可被直接下载。
Nginx 的 try_files 规则不能简化为 try_files $uri $uri/ /index.php; —— 缺少 $query_string 会导致路由参数(如 ?page=2)丢失,所有分页、搜索、筛选功能全部失效。
正确写法(关键在最后一段):
location / {
try_files $uri $uri/ /index.php?$query_string;
}
另外,location ~ \.php$ 块里必须用 fastcgi_pass 指向正确的 PHP-FPM socket,常见错误是写成 127.0.0.1:9000 却没开 TCP 监听,或写成 /run/php/php8.2-fpm.sock 但实际路径是 /var/run/php/php8.2-fpm.sock。
缓存命令执行顺序不能乱
config:cache → route:cache → view:cache 是唯一安全顺序。反着来会出问题:
- 先跑
route:cache再改配置?缓存路由仍按旧配置解析,APP_URL或ASSET_URL错了就全站资源 404 -
view:cache依赖config('view.compiled'),如果 config 没缓存,它会 fallback 到默认路径,但该路径在 production 下往往不可写,导致 500
每次部署后建议加一句:
php artisan config:clear && php artisan cache:clear && php artisan config:cache && php artisan route:cache && php artisan view:cache
别省掉前面的 clear —— 旧缓存残留是线上 500 最隐蔽的元凶之一。


















