部署
介绍
当您准备将 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 ~ \.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
配置文件中的调试选项决定了实际向用户显示多少错误信息。默认情况下,此选项设置为尊重 APP_DEBUG
环境变量的值,该变量存储在应用程序的 .env
文件中。
在生产环境中,此值应始终为 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 和 Forge Laracasts 上提供的视频系列。
Laravel Vapor
如果您想要一个完全无服务器、自动扩展的部署平台,该平台专为 Laravel 量身定制,请查看 Laravel Vapor。Laravel Vapor 是一个由 AWS 提供支持的 Laravel 无服务器部署平台。在 Vapor 上启动您的 Laravel 基础设施,并爱上无服务器的可扩展性和简单性。Laravel Vapor 由 Laravel 的创建者精心调整,可与框架无缝协作,因此您可以像往常一样继续编写 Laravel 应用程序。