生产环境必须设app_env=production、app_debug=false,并配置app_log_level=error;db_password和app_key不得硬编码,需通过环境变量注入;storage/和bootstrap/cache/需赋权;app_url和session_domain须正确设置并验证。

APP_ENV 和 APP_DEBUG 必须关掉
生产环境里 APP_ENV 要设为 production,APP_DEBUG 必须是 false。开着 APP_DEBUG=true 会把异常堆栈、数据库查询、环境变量全打出来,等于把后门钥匙贴在首页上。
-
APP_ENV=production不只是个标识——它会影响日志级别、缓存行为、配置加载路径 -
APP_DEBUG=false同时要求APP_LOG_LEVEL=error或更严格,否则调试日志仍可能泄露敏感信息 - 如果用
php artisan config:cache,改完必须重新运行,否则 .env 变更不生效
数据库密码和密钥不能写死在代码里
DB_PASSWORD、APP_KEY 这类值绝不能硬编码进配置文件或 Git 提交。Laravel 启动时读取 .env 是第一道防线,一旦泄露,整个应用数据层就裸奔。
-
APP_KEY必须用php artisan key:generate --show生成,且只在部署机上运行一次;重复生成会导致加密 session、cookie 全失效 -
DB_PASSWORD建议从系统环境变量注入(如 Docker 的environment或 systemd 的EnvironmentFile),.env 仅作本地开发 fallback - 检查
git status和.gitignore:确保.env永远不在 Git 历史中——曾经提交过就得重置历史或轮换所有密钥
缓存和日志路径得指向可写目录
Laravel 在生产环境依赖 storage/ 和 bootstrap/cache/ 目录的写权限。Nginx/Apache 用户(比如 www-data)没权限写,就会报 file_put_contents(/path/to/laravel/storage/logs/laravel.log): failed to open stream 这类错。
- 部署后立刻执行:
chmod -R 775 storage/ bootstrap/cache/,再chown -R www-data:www-data storage/ bootstrap/cache/ -
LOG_CHANNEL=stack是默认,但实际要配成single或daily,避免日志文件无限增长;LOG_LEVEL=error防止 debug 日志塞满磁盘 - 如果用 Supervisor 管理队列,
queue:work进程也得有相同目录权限,否则 job 失败不写日志,排查像盲人摸象
APP_URL 和 SESSION_DOMAIN 要匹配真实域名
APP_URL 不只是给邮件链接用的。它影响 CSRF token 生成、asset URL 拼接、甚至 Passport 的 redirect_uri 校验。填错会导致前端请求 419、静态资源 404、OAuth 登录跳转失败。
-
APP_URL=https://api.example.com—— 必须带协议、完整域名,结尾不加斜杠 -
SESSION_DOMAIN=.example.com(注意开头的点)才能让子域共享 session;如果只写example.com,admin.example.com就拿不到 cookie - HTTPS 强制场景下,还要加
SESSION_SECURE_COOKIE=true和APP_URL一致,否则 Chrome 会静默丢弃 Cookie
php artisan tinker --execute="echo config('app.env');",确认读到的是 production,而不是因为权限、缓存或拼写问题悄悄回退到了 local。











