部署
简介
当你准备好将 Laravel 应用程序部署到生产环境时,你可以采取一些重要的措施来确保你的应用程序尽可能高效地运行。在本文档中,我们将介绍一些很好的起点,以确保你的 Laravel 应用程序被正确部署。
服务器要求
Laravel 框架有一些系统要求。你应该确保你的 Web 服务器具有以下最低 PHP 版本和扩展:
- PHP >= 8.3
- 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 Cloud。
请确保,如下面的配置所示,你的 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.3-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 optimizeoptimize:clear 方法可用于删除 optimize 命令生成的所有缓存文件以及默认缓存驱动程序中的所有键:
php artisan optimize:clear在以下文档中,我们将讨论由 optimize 命令执行的每个细粒度优化命令。
缓存配置
将应用程序部署到生产环境时,你应确保在部署过程中运行 config:cache Artisan 命令:
php artisan config:cache此命令会将所有 Laravel 配置文件合并到一个缓存文件中,这大大减少了框架在加载配置值时必须对文件系统进行的访问次数。
WARNING
如果在部署过程中执行 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 视图,因此它们不会按需编译,从而提高了每个返回视图的请求的性能。
重新加载服务
NOTE
部署到 Laravel Cloud 时,无需使用 reload 命令,因为所有服务的优雅重新加载都是自动处理的。
部署新版本的应用程序后,任何长时间运行的服务(如队列工作器、Laravel Reverb 或 Laravel Octane)都应重新加载/重启以使用新代码。Laravel 提供了一条 reload Artisan 命令,该命令将终止这些服务:
php artisan reload如果你没有使用 Laravel Cloud,你应手动配置一个进程监视器,以便在可重新加载的进程退出时检测到并自动重启它们。
调试模式
config/app.php 配置文件中的 debug 选项决定了实际向用户显示多少错误信息。默认情况下,此选项设置为遵循存储在应用程序 .env 文件中的 APP_DEBUG 环境变量的值。
WARNING
在生产环境中,此值应始终为 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', // [tl! 移除]
health: '/status', // [tl! 添加]
)当对此路由进行 HTTP 请求时,Laravel 还将调度一个 Illuminate\Foundation\Events\DiagnosingHealth 事件,允许你执行与应用程序相关的其他健康检查。在此事件的监听器中,你可以检查应用程序的数据库或缓存状态。如果你检测到应用程序出现问题,你可以简单地从监听器抛出异常。
使用 Laravel Cloud 或 Forge 部署
Laravel Cloud
如果你想要一个为 Laravel 调优的、完全托管的、自动扩展的部署平台,请查看 Laravel Cloud。Laravel Cloud 是一个专为 Laravel 打造的强大部署平台,提供托管计算、数据库、缓存和对象存储。
在 Cloud 上启动你的 Laravel 应用程序,并爱上这种可扩展的简洁性。Laravel Cloud 由 Laravel 的创建者精心调优,可与框架无缝协作,因此你可以像往常一样继续编写 Laravel 应用程序。
Laravel Forge
如果你倾向于管理自己的服务器,但不太熟悉配置运行健壮的 Laravel 应用程序所需的各种服务,Laravel Forge 是一个针对 Laravel 应用程序的 VPS 服务器管理平台。
Laravel Forge 可以在各种基础设施提供商(如 DigitalOcean、Linode、AWS 等)上创建服务器。此外,Forge 会安装和管理构建健壮 Laravel 应用程序所需的所有工具,例如 Nginx、MySQL、Redis、Memcached、Beanstalk 等。