laravel上生产核心是跑得稳、防得住、扛得久:1.root必须指向public目录;2.location /需配try_files $uri $uri/ /index.php?$query_string;3.须deny访问.env等敏感文件。

Nginx 必须配对的三件事
root 必须指向 public 目录,不能是项目根目录;否则 index.php 找不到,所有请求都 404。
- server 块里写:root /var/www/myapp/public;
- location / 块必须带 try_files:try_files $uri $uri/ /index.php?$query_string;
- PHP 处理块要匹配 .php 文件,并把请求转给 php-fpm socket(如 unix:/run/php/php8.1-fpm.sock),不能漏掉 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
- 加一行禁止访问敏感文件:location ~ /\.env { deny all; }
Apache 要打开两个开关
默认 Apache 不读 .htaccess,也不允许重写,Laravel 的路由和静态资源就全崩。
- 先启用模块:sudo a2enmod rewrite && sudo systemctl restart apache2
- DocumentRoot 必须设为 public 目录:DocumentRoot /var/www/myapp/public
- 对应目录块里必须允许覆盖:
AllowOverride All Require all granted - 同样加保护:在 Directory 块内加
Require all denied
环境变量和权限卡死底线
APP_DEBUG=true 或 .env 可被下载,等于把数据库密码贴在门口;storage 没写权限,日志写不进、缓存生成失败、上传直接报错。
- .env 文件生成后立刻执行:chmod 600 .env
- APP_KEY 必须用 php artisan key:generate --force 生成,不能手填、不能复用开发环境的值
- storage 和 bootstrap/cache 目录必须让 Web 用户可写:chown -R www-data:www-data storage bootstrap/cache(Ubuntu/Debian)
- APP_ENV=production 且 APP_DEBUG=false —— 这两条不满足,Artisan 命令会拒绝执行 config:cache 等操作
缓存命令不是“优化”,是启动前提
没跑 config:cache,每次请求都要重新加载全部配置,CPU 瞬间飙高;没跑 route:cache,闭包路由会报错;view:cache 不强制,但跳过 Blade 编译能明显提速。
- 上线前必跑:php artisan config:cache && php artisan route:cache && php artisan view:cache
- 改了 config/*.php、routes/*.php 或视图结构后,必须重跑对应命令
- route:cache 不支持闭包路由(即 Route::get('/', function () { ... })),这类项目只能跳过











