部署需解决“谁在跑、怎么跑稳、谁能看到”:APP_ENV=production与APP_DEBUG=false使错误静默写日志,storage/logs权限、config缓存、Web服务器根目录指向public/、禁用.env访问等缺一不可。

本地运行只管“能跑”,部署必须解决“谁在跑、怎么跑稳、谁能看到”这三个问题。
APP_ENV 和 APP_DEBUG 的实际影响
本地开发时通常设 APP_ENV=local 且 APP_DEBUG=true,错误会完整堆栈输出到浏览器;一上生产环境,APP_ENV=production + APP_DEBUG=false 就意味着所有异常被静默捕获,只写日志——如果没配好日志路径或权限,你会连报错都看不到。
常见踩坑点:
-
storage/logs目录权限不对(Web 服务器用户不可写)→ 日志空白,以为“没出错” - 忘记执行
php artisan config:clear→ 旧的.env缓存还在,新配置不生效 - 用
php artisan serve直接上线 → 这个命令仅用于开发,无并发处理能力,生产必须走 Nginx/Apache
缓存驱动从 file 切到 redis 的硬性要求
本地开发常用 CACHE_DRIVER=file,简单省事;但部署后若仍用 file,在多进程/负载均衡场景下会直接失效:不同 worker 写各自文件,缓存不共享、不一致。
必须切换为 redis 或 memcached,且要确认:
- PHP 扩展
redis已启用(php -m | grep redis) - Redis 服务可连(
redis-cli -h 127.0.0.1 -p 6379 ping返回PONG) -
config/cache.php中'connection' => 'cache'对应的 Redis 配置存在且正确 - 执行过
php artisan config:cache(否则.env里的CACHE_DRIVER不会被读取)
public/ 目录暴露与 Web 服务器根目录设置
本地用 php artisan serve 时,框架自动把 public/ 当作 Web 根;但 Nginx/Apache 默认指向项目根目录,若不手动改配置,.env、app/ 等敏感目录可能被直接下载。
Nginx 必须明确指定 root /var/www/your-app/public;,Apache 要确保 DocumentRoot 指向 public/,并且 .htaccess 生效(AllowOverride All)。
容易忽略的细节:
- 未禁用
.env文件的 HTTP 访问(Nginx 加location ~ /\.env { deny all; }) - 未关闭 PHP 的
expose_php = Off(避免泄露版本号) - 未设置
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;(防止路径解析绕过)
部署不是“把代码拷过去再敲个 php artisan serve”,而是重新定义应用与操作系统、Web 服务器、存储层之间的契约。任何一个环节的默认值没覆盖,都可能让应用在本地活蹦乱跳,上线后静默失败。


















