1. 环境准备与Laravel项目创建
在开始部署Laravel项目之前,我们需要确保开发环境已经准备就绪。PHP开发环境的核心组件包括PHP运行时、Composer依赖管理工具以及Web服务器(Nginx或Apache)。以下是详细的环境配置步骤:
1.1 PHP与Composer安装
对于大多数Linux发行版,可以通过包管理器直接安装PHP和必要扩展:
# Ubuntu/Debian sudo apt update sudo apt install php php-cli php-fpm php-mysql php-mbstring php-xml php-zip php-curl # CentOS/RHEL sudo yum install epel-release sudo yum install php php-cli php-fpm php-mysqlnd php-mbstring php-xml php-zip php-curlComposer作为PHP的依赖管理工具,其安装方法如下:
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php composer-setup.php php -r "unlink('composer-setup.php');" sudo mv composer.phar /usr/local/bin/composer1.2 创建Laravel项目
使用Composer创建Laravel项目时,建议指定最新稳定版本。以下是创建项目的两种标准方式:
基础创建命令:
composer create-project --prefer-dist laravel/laravel project-name指定版本创建(以Laravel 9为例):
composer create-project --prefer-dist laravel/laravel=9.* project-name项目创建完成后,需要设置存储目录权限:
cd project-name chmod -R 775 storage bootstrap/cache2. 本地开发环境配置
2.1 使用内置开发服务器
Laravel自带了一个便捷的开发服务器,适合快速启动项目:
php artisan serve --host=0.0.0.0 --port=8000这个命令会启动一个监听8000端口的开发服务器,--host参数设置为0.0.0.0允许外部访问。
2.2 数据库配置
修改.env文件配置数据库连接:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD=运行数据库迁移:
php artisan migrate3. Apache服务器部署配置
3.1 虚拟主机配置
Apache的配置主要集中在虚拟主机文件的设置上。以下是典型的Laravel项目Apache配置:
<VirtualHost *:80> ServerName yourdomain.com DocumentRoot /var/www/project-name/public <Directory /var/www/project-name/public> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>关键配置要点:
- DocumentRoot必须指向public目录
- AllowOverride All允许.htaccess文件生效
- 需要启用mod_rewrite模块
3.2 权限与优化配置
确保Apache用户有适当的文件权限:
sudo chown -R www-data:www-data /var/www/project-name sudo chmod -R 755 /var/www/project-name/storage.htaccess文件优化(public/.htaccess):
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews </IfModule> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>4. Nginx服务器部署配置
4.1 基础Nginx配置
Nginx的配置与Apache有所不同,以下是一个完整的Laravel项目Nginx配置示例:
server { listen 80; server_name yourdomain.com; root /var/www/project-name/public; index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.(?!well-known).* { deny all; } }4.2 PHP-FPM配置优化
调整PHP-FPM池配置(/etc/php/8.1/fpm/pool.d/www.conf):
pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 354.3 性能优化技巧
- 启用OPcache:
opcache.enable=1 opcache.memory_consumption=128 opcache.max_accelerated_files=10000 opcache.revalidate_freq=60- 配置Nginx缓存:
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; add_header Cache-Control "public, no-transform"; }5. Laravel项目目录结构详解
5.1 核心目录功能
完整的Laravel项目目录结构及其主要功能:
project-name/ ├── app/ # 应用核心代码 │ ├── Console/ # Artisan命令 │ ├── Exceptions/ # 异常处理 │ ├── Http/ # 控制器、中间件 │ ├── Models/ # 数据模型 │ └── Providers/ # 服务提供者 ├── bootstrap/ # 框架启动文件 ├── config/ # 配置文件 ├── database/ # 数据库相关 │ ├── factories/ # 模型工厂 │ ├── migrations/ # 数据库迁移 │ └── seeders/ # 数据填充 ├── public/ # Web入口目录 │ ├── css/ # 样式文件 │ ├── js/ # JavaScript文件 │ └── index.php # 入口文件 ├── resources/ # 前端资源 │ ├── js/ # 原始JS文件 │ ├── lang/ # 多语言文件 │ ├── sass/ # Sass样式文件 │ └── views/ # Blade模板 ├── routes/ # 路由定义 │ ├── api.php # API路由 │ ├── channels.php # 广播频道 │ ├── console.php # 控制台路由 │ └── web.php # Web路由 ├── storage/ # 存储目录 │ ├── app/ # 应用文件 │ ├── framework/ # 框架文件 │ └── logs/ # 日志文件 ├── tests/ # 测试代码 ├── vendor/ # Composer依赖 └── .env # 环境配置5.2 重要文件说明
- .env文件:环境配置文件,包含数据库连接、应用密钥等敏感信息
- composer.json:定义项目依赖和脚本
- artisan:Laravel命令行工具入口
- server.php:内置开发服务器入口
6. 部署常见问题与解决方案
6.1 权限问题处理
部署时最常见的权限问题解决方案:
sudo chown -R www-data:www-data /var/www/project-name sudo find /var/www/project-name -type f -exec chmod 644 {} \; sudo find /var/www/project-name -type d -exec chmod 755 {} \; sudo chmod -R 777 storage bootstrap/cache6.2 500错误排查步骤
- 检查storage和bootstrap/cache目录权限
- 查看storage/logs/laravel.log错误日志
- 确认.env文件存在且配置正确
- 运行
php artisan config:clear - 检查PHP扩展是否安装完整
6.3 性能优化建议
- 路由缓存:
php artisan route:cache- 配置缓存:
php artisan config:cache- 视图缓存:
php artisan view:cache- 使用队列处理耗时任务:
php artisan queue:work7. 进阶部署技巧
7.1 自动化部署脚本
基本的部署脚本示例:
#!/bin/bash # 进入项目目录 cd /var/www/project-name # 拉取最新代码 git pull origin main # 安装依赖 composer install --no-dev --optimize-autoloader # 迁移数据库 php artisan migrate --force # 清除缓存 php artisan cache:clear php artisan view:clear # 优化性能 php artisan config:cache php artisan route:cache php artisan view:cache # 设置权限 chown -R www-data:www-data /var/www/project-name chmod -R 755 storage bootstrap/cache7.2 多环境配置管理
通过.env文件管理不同环境配置:
# 开发环境 APP_ENV=local APP_DEBUG=true # 生产环境 APP_ENV=production APP_DEBUG=false使用config()函数获取配置:
$debug = config('app.debug');7.3 负载均衡配置
当使用多台服务器时,需要注意:
- 共享session存储(使用数据库或Redis)
- 共享文件存储(使用云存储或NFS)
- 配置统一的队列系统
Redis会话配置(.env):
SESSION_DRIVER=redis REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=63798. 安全加固措施
8.1 基本安全配置
- 生产环境关闭调试模式:
APP_DEBUG=false- 设置安全的APP_KEY:
php artisan key:generate- 防止目录遍历:
location ~ /\. { deny all; }8.2 CSRF保护
Laravel自动为每个活跃用户会话生成CSRF令牌,表单中需要包含:
<form method="POST" action="/profile"> @csrf ... </form>8.3 XSS防护
Blade模板自动转义输出:
{{ $userProvidedInput }}需要原生输出时使用:
{!! $trustedHtml !!}9. 监控与维护
9.1 日志配置
自定义日志通道(config/logging.php):
'channels' => [ 'stack' => [ 'driver' => 'stack', 'channels' => ['single', 'slack'], ], 'slack' => [ 'driver' => 'slack', 'url' => env('LOG_SLACK_WEBHOOK_URL'), 'username' => 'Laravel Log', 'emoji' => ':boom:', 'level' => 'critical', ], ],9.2 健康检查路由
添加健康检查端点(routes/web.php):
Route::get('/health', function() { return response()->json([ 'status' => 'ok', 'timestamp' => now(), ]); });9.3 性能监控
使用Laravel Telescope(仅开发环境):
composer require laravel/telescope php artisan telescope:install php artisan migrate10. 容器化部署
10.1 Docker基础配置
docker-compose.yml示例:
version: '3' services: app: build: context: . dockerfile: Dockerfile ports: - "8000:8000" volumes: - .:/var/www/html depends_on: - db db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: laravel ports: - "3306:3306" volumes: - db_data:/var/lib/mysql volumes: db_data:10.2 多阶段构建Dockerfile
# 构建阶段 FROM composer:2 as builder WORKDIR /app COPY . . RUN composer install --no-dev --optimize-autoloader # 运行阶段 FROM php:8.1-fpm WORKDIR /var/www/html COPY --from=builder /app . COPY docker/php.ini /usr/local/etc/php/conf.d/custom.ini RUN chown -R www-data:www-data /var/www/html/storage10.3 Kubernetes部署
基本的deployment.yaml:
apiVersion: apps/v1 kind: Deployment metadata: name: laravel-app spec: replicas: 3 selector: matchLabels: app: laravel template: metadata: labels: app: laravel spec: containers: - name: app image: your-repo/laravel-app:latest ports: - containerPort: 8000 envFrom: - secretRef: name: laravel-secrets11. 持续集成与交付
11.1 GitHub Actions配置
基础工作流文件(.github/workflows/deploy.yml):
name: Deploy Laravel on: push: branches: [ main ] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Install dependencies run: composer install --no-interaction --prefer-dist --optimize-autoloader - name: Run tests run: php artisan test - name: Deploy to production uses: appleboy/ssh-action@master with: host: ${{ secrets.SSH_HOST }} username: ${{ secrets.SSH_USER }} key: ${{ secrets.SSH_KEY }} script: | cd /var/www/project-name git pull origin main composer install --no-interaction --prefer-dist --optimize-autoloader php artisan migrate --force php artisan config:cache php artisan route:cache php artisan view:cache11.2 自动化测试集成
PHPUnit测试示例:
class ExampleTest extends TestCase { public function test_basic_test() { $response = $this->get('/'); $response->assertStatus(200); } public function test_database_works() { $user = User::factory()->create(); $this->assertDatabaseHas('users', [ 'email' => $user->email ]); } }12. 备份与恢复策略
12.1 数据库备份
使用Laravel Backup包:
composer require spatie/laravel-backup配置(config/backup.php):
'backup' => [ 'destination' => [ 'disks' => ['local', 's3'], ], ],手动执行备份:
php artisan backup:run12.2 文件备份
存储目录备份脚本:
tar -czvf storage_backup_$(date +%Y%m%d).tar.gz storage/12.3 恢复流程
数据库恢复步骤:
- 停止应用服务
- 恢复数据库备份
- 清除缓存
- 重启服务
13. 高可用架构设计
13.1 数据库主从复制
配置多个数据库连接(config/database.php):
'mysql' => [ 'read' => [ 'host' => [ '192.168.1.1', '192.168.1.2', ], ], 'write' => [ 'host' => [ '192.168.1.3', ], ], ],13.2 Redis集群
配置Redis集群(config/database.php):
'redis' => [ 'cluster' => true, 'default' => [ 'host' => env('REDIS_HOST', '127.0.0.1'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', 6379), 'database' => 0, ], ],13.3 文件存储分离
使用云存储(config/filesystems.php):
'disks' => [ 's3' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION'), 'bucket' => env('AWS_BUCKET'), ], ],14. 性能监控与调优
14.1 New Relic集成
安装New Relic PHP agent:
sudo apt-get install newrelic-php5 sudo newrelic-install install配置Laravel提供事务名称:
public function boot() { if (extension_loaded('newrelic')) { newrelic_name_transaction( Request::path() ?: '/' ); } }14.2 Blackfire分析
安装Blackfire探针:
curl -s https://packagecloud.io/install/repositories/blackfire.io/stable/script.deb.sh | sudo bash sudo apt-get install blackfire-php配置.profiler中间件:
public function handle($request, Closure $next) { if (extension_loaded('blackfire')) { $probe = new \Blackfire\Probe(); $probe->enable(); } $response = $next($request); if (isset($probe)) { $probe->close(); } return $response; }15. 安全审计与加固
15.1 依赖漏洞扫描
使用Laravel Security Checker:
composer require enlightn/security-checker php artisan security:check15.2 静态代码分析
使用PHPStan进行静态分析:
composer require --dev phpstan/phpstan ./vendor/bin/phpstan analyse15.3 安全头设置
通过中间件添加安全头:
public function handle($request, Closure $next) { $response = $next($request); $response->headers->set('X-Content-Type-Options', 'nosniff'); $response->headers->set('X-Frame-Options', 'SAMEORIGIN'); $response->headers->set('X-XSS-Protection', '1; mode=block'); $response->headers->set('Strict-Transport-Security', 'max-age=31536000; includeSubDomains'); return $response; }16. 多服务器部署策略
16.1 蓝绿部署
部署流程:
- 准备新版本环境(蓝环境)
- 切换负载均衡指向蓝环境
- 监控新版本运行状态
- 出现问题则回滚到绿环境
16.2 金丝雀发布
部署步骤:
- 向小部分用户发布新版本
- 收集反馈和监控数据
- 逐步扩大发布范围
- 全量发布或回滚
16.3 零停机部署
实现方法:
- 使用负载均衡器排干连接
- 部署到单个服务器
- 重新加入负载均衡
- 重复直到所有服务器更新
17. 灾难恢复计划
17.1 恢复优先级确定
关键系统恢复顺序:
- 数据库服务
- 应用服务器
- 文件存储
- 监控系统
17.2 备份验证流程
定期验证备份有效性:
- 每月执行一次恢复测试
- 验证数据完整性
- 记录恢复时间指标
17.3 应急响应流程
故障响应步骤:
- 识别问题影响范围
- 启动应急响应团队
- 执行恢复程序
- 事后分析与改进
18. 成本优化策略
18.1 资源利用率监控
使用工具监控:
- AWS CloudWatch
- Prometheus + Grafana
- New Relic Infrastructure
18.2 自动伸缩配置
AWS Auto Scaling配置:
{ "AutoScalingGroupName": "laravel-asg", "MinSize": 2, "MaxSize": 10, "DesiredCapacity": 4, "TargetTrackingConfigurations": [ { "PredefinedMetricSpecification": { "PredefinedMetricType": "ASGAverageCPUUtilization" }, "TargetValue": 60.0 } ] }18.3 冷热数据分离
数据库归档策略:
- 将超过6个月的数据移动到归档表
- 使用Laravel的查询作用域限制访问
- 提供专门的归档数据访问接口
19. 文档与知识管理
19.1 部署文档编写
应包括:
- 系统架构图
- 部署流程图
- 配置参数说明
- 应急联系方式
19.2 Runbook创建
标准操作流程示例:
- 日常维护检查清单
- 常见问题解决方法
- 升级回滚步骤
- 性能调优指南
19.3 知识共享机制
建立:
- 内部Wiki系统
- 定期技术分享会
- 代码审查制度
- 故障复盘文化
20. 未来架构演进
20.1 微服务拆分策略
潜在拆分点:
- 用户认证服务
- 支付处理服务
- 报表生成服务
- 通知发送服务
20.2 无服务器架构
使用Laravel Vapor:
- 部署到AWS Lambda
- 自动扩展能力
- 按使用量计费
- 简化运维工作
20.3 边缘计算应用
潜在应用场景:
- 静态资源CDN分发
- API响应缓存
- 地理位置敏感处理
- 降低主服务器负载