部署
简介
当你准备将 Laravel 应用部署到生产环境时,有一些重要的事项需要确保应用能够尽可能高效地运行。在本文档中,我们将介绍一些确保正确部署 Laravel 应用的重要起点。
服务器要求
Laravel 框架有一些系统要求。你应该确保你的 Web 服务器具有以下最低 PHP 版本和扩展:
- PHP >= 8.2
- Ctype PHP 扩展
- cURL PHP 扩展
- DOM PHP 扩展
- Fileinfo PHP 扩展
- Filter PHP 扩展
- Hash PHP 扩展
- Mbstring PHP 扩展
- OpenSSL PHP 扩展
- PCRE PHP 扩展
- PDO PHP 扩展
- Session PHP 扩展
- Tokenizer PHP 扩展
- XML PHP 扩展
服务器配置
Nginx
如果你要将应用部署到运行 Nginx 的服务器上,可以使用以下配置文件作为配置 Web 服务器的起点。根据你的服务器配置,这个文件很可能需要自定义。如果你需要服务器管理方面的帮助,可以考虑使用 Laravel 官方的服务器管理和部署服务,如 Laravel Forge。
请确保,如下面的配置所示,你的 Web 服务器将所有请求都指向应用的 public/index.php
文件。你永远不应该尝试将 index.php
文件移动到项目根目录,因为从项目根目录提供服务会将许多敏感的配置文件暴露给公共互联网:
server {
listen 80;
listen [::]:80;
server_name example.com;
root /srv/example.com/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ ^/index\.php(/|$) {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_hide_header X-Powered-By;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
FrankenPHP
FrankenPHP 也可以用来运行你的 Laravel 应用。FrankenPHP 是一个用 Go 编写的现代 PHP 应用服务器。要使用 FrankenPHP 运行 Laravel PHP 应用,你只需要调用它的 php-server
命令:
frankenphp php-server -r public/
要利用 FrankenPHP 支持的更强大的功能,如其 Laravel Octane 集成、HTTP/3、现代压缩,或将 Laravel 应用打包为独立二进制文件的能力,请参考 FrankenPHP 的 Laravel 文档。
目录权限
Laravel 需要写入 bootstrap/cache
和 storage
目录,所以你应该确保 Web 服务器进程所有者有权限写入这些目录。
优化
在将应用部署到生产环境时,有多个文件需要缓存,包括配置、事件、路由和视图文件。Laravel 提供了一个方便的 optimize
Artisan 命令,可以缓存所有这些文件。这个命令通常应该作为应用部署过程的一部分来执行:
php artisan optimize
optimize:clear
命令可用于删除 optimize
命令生成的所有缓存文件以及默认缓存驱动程序中的所有键:
php artisan optimize:clear
在接下来的文档中,我们将讨论由 optimize
命令执行的每个细粒度优化命令。
缓存配置
在将应用部署到生产环境时,你应该确保在部署过程中运行 config:cache
Artisan 命令:
php artisan config:cache
这个命令会将 Laravel 的所有配置文件合并到一个缓存文件中,这大大减少了框架在加载配置值时需要对文件系统进行的访问次数。
如果你在部署过程中执行 config:cache
命令,请确保只在配置文件中调用 env
函数。一旦配置被缓存,.env
文件将不会被加载,所有对 .env
变量的 env
函数调用都将返回 null
。
缓存事件
你应该在部署过程中缓存应用的自动发现事件到监听器映射。这可以通过在部署过程中调用 event:cache
Artisan 命令来完成:
php artisan event:cache
缓存路由
如果你正在构建一个有很多路由的大型应用,你应该确保在部署过程中运行 route:cache
Artisan 命令:
php artisan route:cache
这个命令将所有路由注册减少为缓存文件中的单个方法调用,在注册数百个路由时可以提高路由注册的性能。
缓存视图
在将应用部署到生产环境时,你应该确保在部署过程中运行 view:cache
Artisan 命令:
php artisan view:cache
这个命令预编译所有 Blade 视图,这样它们就不会按需编译,从而提高每个返回视图的请求的性能。
调试模式
config/app.php
配置文件中的调试选项决定了向用户显示多少错误信息。默认情况下,此选项设置为遵循存储在应用的 .env
文件中的 APP_DEBUG
环境变量的值。
在生产环境中,这个值应该始终设置为 false
。如果在生产环境中将 APP_DEBUG
变量设置为 true
,你可能会将敏感的配置值暴露给应用的最终用户。
健康检查路由
Laravel 包含一个内置的健康检查路由,可用于监控应用的状态。在生产环境中,这个路由可以用来向正常运行时间监控器、负载均衡器或 Kubernetes 等编排系统报告应用的状态。
默认情况下,健康检查路由在 /up
路径提供服务,如果应用启动时没有异常,将返回 200 HTTP 响应。否则,将返回 500 HTTP 响应。你可以在应用的 bootstrap/app
文件中配置此路由的 URI:
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
health: '/status',
)
当向此路由发出 HTTP 请求时,Laravel 还会触发 Illuminate\Foundation\Events\DiagnosingHealth
事件,允许你执行与应用相关的额外健康检查。在此事件的监听器中,你可以检查应用的数据库或缓存状态。如果你检测到应用有问题,你可以简单地从监听器中抛出异常。
使用 Forge / Vapor 轻松部署
Laravel Forge
如果你还没有准备好管理自己的服务器配置,或者对配置运行强大的 Laravel 应用所需的各种服务不太熟悉,Laravel Forge 是一个很好的替代选择。
Laravel Forge 可以在各种基础设施提供商(如 DigitalOcean、Linode、AWS 等)上创建服务器。此外,Forge 还安装和管理构建强大 Laravel 应用所需的所有工具,如 Nginx、MySQL、Redis、Memcached、Beanstalk 等。
想要完整的 Laravel Forge 部署指南?查看 Laravel Bootcamp 和 Laracasts 上提供的 Forge 视频系列。
Laravel Vapor
如果你想要一个完全无服务器、自动扩展的部署平台,专门为 Laravel 优化,请查看 Laravel Vapor。Laravel Vapor 是一个无服务器部署平台,由 AWS 提供支持。在 Vapor 上启动你的 Laravel 基础设施,爱上无服务器的简单可扩展性。Laravel Vapor 由 Laravel 的创建者精心调整,可以与框架无缝协作,因此你可以继续像以前一样编写 Laravel 应用。