Laravel 部署与优化

将 Laravel 应用从开发环境部署到生产环境,并确保其高性能、高可用性,是每位开发者必须掌握的技能。本章将详细介绍部署前的准备、各类优化命令、资产编译、队列和调度器配置,以及自动化部署工具,帮助你构建健壮的生产级应用。

🚀 核心目标: 通过合理的配置和优化,使 Laravel 应用在生产环境中具备快速的响应速度、稳定的运行状态和便捷的维护方式。

1. 部署前准备

在将代码推送到服务器之前,需要确保以下事项:

  • 环境变量: 生产环境的 .env 文件应设置 APP_ENV=productionAPP_DEBUG=false,并配置真实的数据库、缓存等连接信息。
  • 权限设置: 确保 storage/bootstrap/cache/ 目录可写,通常设置为 775755,并由 Web 服务器用户(如 www-data)拥有。
  • PHP 扩展: 确认服务器安装了必要的 PHP 扩展(BCMath、Ctype、JSON、Mbstring、OpenSSL、PDO、Tokenizer、XML)。
  • Composer: 生产环境通常使用 composer install --no-dev --optimize-autoloader 安装依赖,跳过开发包并优化自动加载。

2. 核心优化命令

Laravel 提供了多个 Artisan 命令来缓存配置、路由、视图等,大幅提升生产环境性能。


# 缓存配置文件(将 config 目录下所有配置合并到一个文件)
php artisan config:cache

# 缓存路由(将路由注册信息缓存)
php artisan route:cache

# 缓存视图(预编译 Blade 模板)
php artisan view:cache

# 缓存事件(优化事件监听器发现)
php artisan event:cache

# 一键执行上述所有缓存(Laravel 11 中 optimize 命令)
php artisan optimize
                    
⚠️ 注意: 缓存命令执行后,任何对配置、路由、视图的修改都需要重新运行对应命令才能生效。因此,在部署时通常会在代码拉取后执行这些命令。

清除缓存(维护或调试时使用):


php artisan optimize:clear   # 清除所有缓存
php artisan config:clear
php artisan route:clear
php artisan view:clear
php artisan event:clear
                    

3. 自动加载优化

Composer 的自动加载器在生产环境应生成优化后的类映射,减少文件查找开销:


composer install --no-dev --optimize-autoloader
                    

如果已有 vendor/ 目录,也可以单独运行:


composer dump-autoload --optimize
                    

4. 资产编译

Laravel 11 默认使用 Vite 编译前端资源(CSS、JS)。在部署前需要运行:


npm install --production   # 只安装生产依赖
npm run build              # 生成编译后的文件(位于 public/build)
                    

如果使用 Laravel Mix,命令类似:


npm install --production
npm run production
                    

编译后的静态文件应包含在部署包中,或通过 CDN 分发。

5. 队列配置与 Supervisor

生产环境中,队列工作器应使用进程管理工具(如 Supervisor)确保其持续运行。安装 Supervisor:


sudo apt-get install supervisor
                    

创建配置文件 /etc/supervisor/conf.d/laravel-worker.conf


[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /path/to/your/project/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/path/to/your/project/storage/logs/worker.log
stopwaitsecs=3600
                    

然后启动 Supervisor:


sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
                    

6. 调度器配置

确保服务器的 Cron 每分钟执行 Laravel 调度器:


* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
                    

将此条目添加到 crontab -e 中。调度器会负责执行所有定义的定时任务。

7. 使用 Envoy 自动化部署

Laravel Envoy 是一个基于 Blade 语法的 SSH 任务运行器,可用于编写部署脚本。安装 Envoy:


composer require laravel/envoy --dev
                    

在项目根目录创建 Envoy.blade.php


@servers(['web' => 'user@your-server.com'])

@task('deploy', ['on' => 'web'])
    cd /var/www/your-project
    git pull origin main
    composer install --no-interaction --no-dev --optimize-autoloader
    php artisan migrate --force
    php artisan config:cache
    php artisan route:cache
    php artisan view:cache
    php artisan event:cache
    npm install --production
    npm run build
    php artisan queue:restart
    php artisan horizon:terminate  # 如果使用 Horizon
@endtask
                    

执行部署:


envoy run deploy
                    

8. 性能优化技巧

  • 使用缓存: 对频繁查询的数据使用 Redis 或 Memcached 缓存。
  • 数据库索引: 确保查询字段有适当的索引,使用 explain 分析慢查询。
  • 使用 CDN: 将静态资源(图片、CSS、JS)托管到 CDN 加速。
  • 启用 OPCache: 确保 PHP 的 OPCache 已启用,大幅提升 PHP 代码执行速度。
  • 使用 Nginx 替代 Apache: Nginx 处理静态文件更高效,且内存占用更低。
  • HTTP/2 与 Gzip: 启用 HTTP/2 和 Gzip 压缩,减少传输体积。

9. 监控与日志

生产环境应配置日志轮转,避免单个日志文件过大。使用 daily 驱动自动分割:


// config/logging.php
'default' => env('LOG_CHANNEL', 'stack'),
'channels' => [
    'stack' => [
        'driver' => 'stack',
        'channels' => ['daily'],
    ],
    'daily' => [
        'driver' => 'daily',
        'path' => storage_path('logs/laravel.log'),
        'level' => 'error',  // 生产环境只记录 error 以上级别
        'days' => 14,
    ],
],
                    

建议集成第三方监控服务(如 Sentry、Bugsnag)捕获异常,并配置服务器监控(如 Prometheus、Datadog)关注 CPU、内存、队列长度等指标。

10. 最佳实践与常见陷阱

  • 部署前测试: 在 staging 环境完整运行部署流程,确保所有优化命令正常。
  • 保留回滚方案: 保留上一版本的备份,便于快速回滚。
  • 使用版本控制管理 .env: 避免将 .env 提交到仓库,但保留 .env.example 作为模板。
  • 维护模式: 部署时使用 php artisan down 将应用置于维护模式,完成后 php artisan up
  • 监控队列长度: 使用 Horizon 或第三方工具监控队列积压,及时扩容工作器。
  • 定期清理日志: 确保日志文件不会填满磁盘,可使用 logrotate 工具。
💡 提示: Laravel Forge 和 Laravel Vapor 等官方服务可以极大简化部署和运维,适合不想管理服务器的团队。

11. 总结

成功的部署不仅是将代码放到服务器上,更需要通过一系列优化命令、配置调整和监控手段,确保应用在生产环境稳定、高效运行。掌握本章内容后,你应该能够自信地完成 Laravel 应用的部署与优化,并具备持续交付的能力。

📖 官方文档: DeploymentOptimization 提供了官方指南。