将 Laravel 应用从开发环境迁移到生产环境是每个开发者都必须面对的任务。正确的部署流程不仅能够确保应用的高可用性和稳定性,还能够提高性能并确保数据安全。本文将详细介绍如何部署 Laravel 应用到生产环境,并确保生产环境中的安全性、性能和稳定性。
一、部署前的准备
在部署 Laravel 应用到生产环境之前,需要确保一些必要的配置和工具已经到位。以下是部署之前的准备工作:
1.1 选择服务器与主机
- 共享主机 vs VPS / 云主机:对于较小的项目,您可以选择共享主机,但对于更大的 Laravel 应用,建议选择 VPS 或云主机(如 DigitalOcean、AWS、Linode、Aliyun等),它们提供更高的自定义性、性能和可扩展性。
- 推荐配置:PHP 7.4 或更高版本、Nginx 或 Apache Web 服务器、MySQL 或 PostgreSQL 数据库。
1.2 配置 .env 文件
确保 .env 文件在开发和生产环境中是不同的。在生产环境中,您应当配置生产数据库、缓存、队列等服务的参数。
APP_NAME=MyApp
APP_ENV=production
APP_KEY=base64:your-app-key
APP_DEBUG=false
APP_URL=http://your-domain.com
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_database
DB_USERNAME=your_db_username
DB_PASSWORD=your_db_password
CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis
- 重要提示:不要将
APP_DEBUG设置为true,以防暴露敏感的错误信息。
1.3 生成应用密钥
Laravel 使用应用密钥来加密用户会话和其他加密数据。在部署到生产环境时,务必运行以下命令生成一个新的密钥:
php artisan key:generate
确保生成的密钥已经写入 .env 文件中的 APP_KEY 字段。
二、生产环境中的依赖安装与配置
2.1 安装 Composer 依赖
在生产环境中,您应当使用 --optimize-autoloader 和 --no-dev 标志来安装生产环境的依赖,这可以提高性能并避免安装开发时需要的依赖。
composer install --optimize-autoloader --no-dev
--no-dev:忽略开发依赖,只安装生产环境需要的包。--optimize-autoloader:优化自动加载器,提高性能。
2.2 配置缓存
Laravel 提供了多个缓存机制,包括路由缓存、视图缓存和配置缓存,这些都能帮助提高应用的性能。在生产环境中,运行以下命令来缓存配置、路由和视图:
php artisan config:cache
php artisan route:cache
php artisan view:cache
config:cache:将所有配置文件缓存为一个文件,减少每次请求时的 I/O 操作。route:cache:将路由信息缓存为一个文件,加速路由匹配。view:cache:将 Blade 视图缓存,提高视图渲染性能。
2.3 生成生产环境数据库迁移
确保您的生产环境数据库已经准备好,并运行 Laravel 的数据库迁移命令来同步数据库结构:
php artisan migrate --force
--force:在生产环境中运行迁移时,需要添加此标志来防止确认提示。
2.4 设置文件权限
确保 Laravel 项目的文件和目录权限正确,尤其是 storage 和 bootstrap/cache 目录需要可写权限:
chmod -R 775 storage
chmod -R 775 bootstrap/cache
- 775:一般情况下,给这些目录设置 775 权限即可。
storage目录:用于日志、缓存和会话存储。bootstrap/cache目录:用于存储应用缓存。
三、Web 服务器配置
Laravel 可以与 Apache 或 Nginx 等 Web 服务器一起工作。以下是两者的配置方式。
3.1 Nginx 配置
Nginx 是一个高效的反向代理服务器,适合与 Laravel 一起使用。以下是一个常见的 Nginx 配置示例,您需要将其添加到您的 Nginx 配置文件中:
server {
listen 80;
server_name your-domain.com;
root /path/to/your/laravel/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/php7.4-fpm.sock; # PHP-FPM socket
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
error_log /var/log/nginx/laravel_error.log;
access_log /var/log/nginx/laravel_access.log;
}
3.2 Apache 配置
如果您使用 Apache,确保启用了 mod_rewrite 模块,并在 .htaccess 文件中配置正确的重写规则。以下是一个基本的 .htaccess 配置:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
3.3 PHP 配置
- PHP-FPM:确保您的 PHP 环境配置正确,并启用适当的扩展(如
mbstring、opcache、pdo_mysql等)。 - OPcache:在生产环境中开启 OPcache 可以提高 PHP 脚本的执行效率。修改 PHP 配置文件
php.ini,并启用 OPcache:
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
四、监控与日志
4.1 日志管理
Laravel 默认将日志写入 storage/logs 目录。您可以使用不同的日志渠道来处理日志。例如,生产环境中可以将日志写入远程服务,如 Papertrail 或 Loggly。您可以在 .env 文件中设置日志驱动:
LOG_CHANNEL=stack
4.2 监控应用
- Laravel Horizon:如果您使用 Laravel 队列,建议使用 Horizon 来监控队列的状态。
- 服务器监控:使用工具如
New Relic、Datadog或Grafana监控服务器和应用的性能,及时发现并解决问题。
五、安全性配置
5.1 禁用调试模式
确保在生产环境中禁用 Laravel 的调试模式,以防泄漏敏感的错误信息:
APP_DEBUG=false
5.2 HTTPS 配置
强烈建议在生产环境中启用 HTTPS,以保证数据传输的安全性。可以通过设置 Nginx 或 Apache 重定向 HTTP 请求到 HTTPS:
server {
listen 80;
server_name your-domain.com;
return 301 https://$server_name$request_uri;
}
5.3 环境变量管理
在生产环境中,切勿将 .env 文件放入版本控制中。使用环境变量管理工具(如 Laravel Envoyer 或 Docker Secrets)来安全地管理生产环境的密钥和配置。