将 Laravel 应用从开发环境部署到生产环境,并确保其高性能、高可用性,是每位开发者必须掌握的技能。本章将详细介绍部署前的准备、各类优化命令、资产编译、队列和调度器配置,以及自动化部署工具,帮助你构建健壮的生产级应用。
在将代码推送到服务器之前,需要确保以下事项:
.env 文件应设置 APP_ENV=production、APP_DEBUG=false,并配置真实的数据库、缓存等连接信息。storage/ 和 bootstrap/cache/ 目录可写,通常设置为 775 或 755,并由 Web 服务器用户(如 www-data)拥有。composer install --no-dev --optimize-autoloader 安装依赖,跳过开发包并优化自动加载。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
Composer 的自动加载器在生产环境应生成优化后的类映射,减少文件查找开销:
composer install --no-dev --optimize-autoloader
如果已有 vendor/ 目录,也可以单独运行:
composer dump-autoload --optimize
Laravel 11 默认使用 Vite 编译前端资源(CSS、JS)。在部署前需要运行:
npm install --production # 只安装生产依赖
npm run build # 生成编译后的文件(位于 public/build)
如果使用 Laravel Mix,命令类似:
npm install --production
npm run production
编译后的静态文件应包含在部署包中,或通过 CDN 分发。
生产环境中,队列工作器应使用进程管理工具(如 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:*
确保服务器的 Cron 每分钟执行 Laravel 调度器:
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
将此条目添加到 crontab -e 中。调度器会负责执行所有定义的定时任务。
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
explain 分析慢查询。
生产环境应配置日志轮转,避免单个日志文件过大。使用 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、内存、队列长度等指标。
php artisan down 将应用置于维护模式,完成后 php artisan up。logrotate 工具。成功的部署不仅是将代码放到服务器上,更需要通过一系列优化命令、配置调整和监控手段,确保应用在生产环境稳定、高效运行。掌握本章内容后,你应该能够自信地完成 Laravel 应用的部署与优化,并具备持续交付的能力。