简介
当你准备将 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 服务器将所有请求指向应用程序的 php public/index.php
文件。绝不能把 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 ~ \.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 php-server
命令:
frankenphp php-server -r public/
要利用 FrankenPHP 支持的更强大功能,例如其 Laravel Octane 集成、HTTP/3、现代压缩技术或将 Laravel 应用打包为独立的二进制文件,请参阅 FrankenPHP 的 Laravel 文档。
目录权限
Laravel 需要写入 php bootstrap/cache
和 php storage
目录,因此你应确保 Web 服务器进程所有者有权限写入这些目录。
优化
在将应用程序部署到生产环境时,有多种文件应该被缓存,包括配置、事件、路由和视图。Laravel 提供了一个方便的单一 php optimize
Artisan 命令,可以缓存所有这些文件。这个命令通常应该作为应用程序部署过程的一部分被调用:
php artisan optimize
php optimize:clear
方法可以用来删除由 php optimize
命令生成的所有缓存文件:
php artisan optimize:clear
在接下来的文档中,我们将讨论由 php optimize
命令执行的每个细粒度优化命令。
缓存配置
在将应用程序部署到生产环境时,应确保在部署过程中运行 php config:cache
Artisan 命令:
php artisan config:cache
这个命令会将 Laravel 的所有配置文件合并成一个缓存文件,这大大减少了框架在加载配置值时对文件系统进行的访问次数。
注意
如果您在部署过程中执行php config:cache
命令,您应确保只在配置文件中调用php env
函数。一旦配置被缓存,php .env
文件将不会被加载,对php .env
变量的所有调用php env
函数将返回php null
。
缓存事件
在部署过程中,应该缓存应用程序的自动发现的事件到监听器映射。这可以通过在部署期间调用 php event:cache
Artisan 命令来完成:
php artisan event:cache
缓存路由
如果你正在构建一个包含许多路由的大型应用程序,应该确保在部署过程中运行 php route:cache
Artisan 命令:
php artisan route:cache
这个命令将所有的路由注册减少到缓存文件中的单个方法调用,当注册数百个路由时,可以提高路由注册的性能。
缓存视图
当将应用程序部署到生产环境时,你应该确保在部署过程中运行 php view:cache
Artisan 命令:
php artisan view:cache
这个命令预编译所有的 Blade 视图,因此它们不会在需求时编译,从而提高了返回视图的每个请求的性能。
调试模式
php config/app.php
配置文件中的调试选项决定了向用户显示的错误信息量。默认情况下,此选项设置为 php APP_DEBUG
环境变量的值,该变量存储在您应用程序的 php .env
文件中。
注意
在生产环境中,此值应始终为「false」。如果在生产中将php APP_DEBUG
变量设置为「true」,可能会向应用程序的最终用户暴露敏感配置值。
健康检查路由
Laravel 包括一个内置的健康检查路由,可用于监控应用程序的状态。在生产中,此路由可用于向运行时间监控器、负载均衡器或诸如 Kubernetes 之类的编排系统报告应用程序的状态。
默认情况下,健康检查路由在 php /up
地址提供服务,并且如果应用程序无异常启动,将返回 200 HTTP 响应。否则,将返回 500 HTTP 响应。可以在应用程序的 php bootstrap/app
文件中配置此路由的 URI:
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up', // [删除这一行]
health: '/status', // [添加这一行]
)
当对此路由发出 HTTP 请求时,Laravel 还将触发 php 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 和 Forge 在 Laracasts 上的视频系列。
Laravel Vapor
如果想全无服务器的、自动扩展的部署平台,专为 Laravel 调优,请查看 Laravel Vapor。Laravel Vapor 是一个为 Laravel 设计的无服务器部署平台,由 AWS 提供支持。在 Vapor 上启动您的 Laravel 基础设施,并爱上无服务器的可扩展简便性。Laravel Vapor 由 Laravel 的创建者精心调整,以便与框架无缝合作,因此你以像平时一样继续编写 Laravel 应用程序。