生产环境部署laravel必须卡死底线:app_debug=false、app_key用php artisan key:generate --force生成、.env权限设为600并禁止web访问;必须执行config:cache、route:cache、view:cache,且缓存前先修正storage和bootstrap/cache权限。

生产环境配错一个关键项,比如 APP_DEBUG=true 或没运行 config:cache,轻则日志爆炸、性能腰斩,重则密钥泄露、用户会话失效——这不是优化建议,是上线前必须卡死的底线。
APP_KEY 必须用 key:generate --force 生成
别手动填、别复制开发环境的值、别跳过 .env 文件。Laravel 启动早期就依赖 APP_KEY 解密 Session 和 Cookie,缺它或格式错误(比如少了 base64: 前缀),用户一登录就 500。命令必须带 --force,否则在 APP_ENV=production 下会被 Artisan 拒绝执行。
-
cp .env.example .env后,只留空APP_KEY=这一行,其他如APP_ENV=production、APP_DEBUG=false先写好 - 运行
php artisan key:generate --force,检查输出是否含Application key set successfully. - 立刻加固权限:
chmod 600 .env,并确认 Nginx/Apache 配置里有location ~ /\.env { deny all; }
缓存命令不是可选项,是启动前提
config:cache、route:cache、view:cache 这三个命令必须在首次访问前执行,且每次改了配置/路由/视图后都要重跑。不缓存的话,每次请求都要重新解析 .env 和 config/*.php,PHP-FPM 进程 CPU 直接拉满。
-
route:cache仅适用于没用闭包定义路由的项目(即所有路由都注册在routes/web.php等文件里,没写Route::get('/', function () { ... })) -
view:cache跳过 Blade 编译,但如果你用了动态路径(如@include($template)),缓存会失效,得关掉 - 缓存后
env()函数不再生效,所有配置读的是bootstrap/cache/config.php里的静态数组
数据库和日志必须关掉调试开关
生产环境开 DB_LOG_QUERIES=true 或 LOG_LEVEL=debug,等于主动把 SQL 参数、堆栈路径全写进磁盘,IO 扛不住,敏感信息也藏不住。
- 在
.env中明确设DB_LOG_QUERIES=false和LOG_LEVEL=error - 确保
config/logging.php的stack通道没启用debug处理器,daily 或 single 驱动就够了 - 验证方法:手动触发个 404 或 DB 异常,看
storage/logs/laravel.log里有没有 INFO/DEBUG 行——只该有 ERROR 及以上
Redis 不是“高级功能”,是 file 驱动的替代刚需
默认的 file 缓存和会话驱动在多机器、高并发下必然出问题:锁文件争抢、跨服务器 session 丢失、缓存击穿无保护。Redis 不是锦上添花,是解决分布式一致性的最低成本方案。
- 先装扩展:
sudo apt install php-redis,再重启php-fpm -
.env里设CACHE_DRIVER=redis、SESSION_DRIVER=redis,并填对REDIS_HOST和REDIS_PORT - 运行
php artisan cache:clear后,用Cache::put('test', 'ok', 60)测试写入,再用redis-cli get "laravel_database_test"验证是否真进了 Redis
最容易被忽略的是:缓存命令和 APP_KEY 生成必须在 chown 权限之后做。如果先跑 config:cache 再给 www-data 改 ownership,缓存文件可能属主不对,导致 PHP-FPM 读不到,又默默 fallback 到慢路径。











