跳转至内容

部署

简介

当您准备将 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 Cloud 等全托管的 Laravel 平台。

请确保像下方的配置一样,您的 Web 服务器将所有请求指向应用程序的 public/index.php 文件。切勿尝试将 index.php 文件移动到项目根目录,因为从项目根目录提供应用程序服务会将许多敏感的配置文件暴露给公共互联网。

1server {
2 listen 80;
3 listen [::]:80;
4 server_name example.com;
5 root /srv/example.com/public;
6 
7 add_header X-Frame-Options "SAMEORIGIN";
8 add_header X-Content-Type-Options "nosniff";
9 
10 index index.php;
11 
12 charset utf-8;
13 
14 location / {
15 try_files $uri $uri/ /index.php?$query_string;
16 }
17 
18 location = /favicon.ico { access_log off; log_not_found off; }
19 location = /robots.txt { access_log off; log_not_found off; }
20 
21 error_page 404 /index.php;
22 
23 location ~ ^/index\.php(/|$) {
24 fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
25 fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
26 include fastcgi_params;
27 fastcgi_hide_header X-Powered-By;
28 }
29 
30 location ~ /\.(?!well-known).* {
31 deny all;
32 }
33}

FrankenPHP

FrankenPHP 也可用于托管您的 Laravel 应用程序。FrankenPHP 是一个用 Go 编写的现代 PHP 应用服务器。要使用 FrankenPHP 托管 Laravel PHP 应用程序,只需调用其 php-server 命令即可。

1frankenphp php-server -r public/

要利用 FrankenPHP 支持的更强大功能(例如其 Laravel Octane 集成、HTTP/3、现代压缩或将 Laravel 应用程序打包为独立二进制文件的能力),请参阅 FrankenPHP 的 Laravel 文档

目录权限

Laravel 需要对 bootstrap/cachestorage 目录进行写入操作,因此您应确保 Web 服务器进程的所有者拥有这些目录的写入权限。

优化

当将应用程序部署到生产环境时,有多种文件应该被缓存,包括配置、事件、路由和视图。Laravel 提供了一个方便的 optimize Artisan 命令,可以缓存所有这些文件。该命令通常应作为应用程序部署过程的一部分来调用。

1php artisan optimize

optimize:clear 方法可用于删除由 optimize 命令生成的所有缓存文件,以及默认缓存驱动程序中的所有键。

1php artisan optimize:clear

在接下来的文档中,我们将讨论 optimize 命令所执行的每一个细粒度优化命令。

缓存配置

当将应用程序部署到生产环境时,请确保在部署过程中运行 config:cache Artisan 命令。

1php artisan config:cache

此命令会将 Laravel 的所有配置文件合并到一个单一的缓存文件中,这大大减少了框架在加载配置值时对文件系统的访问次数。

如果您在部署过程中执行 config:cache 命令,请确保仅在配置文件内部调用 env 函数。一旦配置被缓存,.env 文件将不会被加载,所有针对 .env 变量的 env 函数调用都将返回 null

缓存事件

您应该在部署过程中缓存应用程序自动发现的事件到监听器的映射。这可以通过在部署期间调用 event:cache Artisan 命令来完成。

1php artisan event:cache

缓存路由

如果您正在构建一个拥有大量路由的大型应用程序,请确保在部署过程中运行 route:cache Artisan 命令。

1php artisan route:cache

此命令将您所有的路由注册简化为缓存文件中的单一方法调用,从而在注册数百个路由时提高了路由注册的性能。

缓存视图

当将应用程序部署到生产环境时,请确保在部署过程中运行 view:cache Artisan 命令。

1php artisan view:cache

此命令会预编译所有 Blade 视图,因此它们无需按需编译,从而提高了每个返回视图的请求的性能。

重启服务

部署到 Laravel Cloud 时,无需使用 reload 命令,因为所有服务的平滑重启会自动处理。

在部署新版本的应用程序后,任何长时间运行的服务(如队列工作进程、Laravel Reverb 或 Laravel Octane)都应进行重启,以便使用新代码。Laravel 提供了一个单一的 reload Artisan 命令来终止这些服务。

1php artisan reload

如果您没有使用 Laravel Cloud,则应手动配置进程监控器,以便在可重启进程退出时检测并自动重启它们。

调试模式

config/app.php 配置文件中的 debug 选项决定了实际向用户显示多少错误信息。默认情况下,此选项设置为遵循 APP_DEBUG 环境变量的值,该值存储在应用程序的 .env 文件中。

在生产环境中,该值应始终为 false。如果生产环境中的 APP_DEBUG 变量设置为 true,您将面临将敏感配置值暴露给应用程序最终用户的风险。

健康检查路由

Laravel 包含一个内置的健康检查路由,可用于监控应用程序的状态。在生产环境中,此路由可用于向正常运行时间监控器、负载均衡器或 Kubernetes 等编排系统报告应用程序的状态。

默认情况下,健康检查路由位于 /up,如果应用程序在没有异常的情况下启动,它将返回 200 HTTP 响应。否则,将返回 500 HTTP 响应。您可以在应用程序的 bootstrap/app 文件中配置此路由的 URI。

1->withRouting(
2 web: __DIR__.'/../routes/web.php',
3 commands: __DIR__.'/../routes/console.php',
4 health: '/up',
5 health: '/status',
6)

当向该路由发送 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 等。