Lzh on GitHub

简介

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

请确保,像下面的配置一样,您的 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/cachestorage 目录,因此您应确保 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 视图,因此它们不会按需编译,从而提高返回视图的每个请求的性能。

重新加载服务

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

在部署应用的新版本后,任何长期运行的服务(例如队列工作器、Laravel Reverb 或 Laravel Octane)都需要重新加载或重启,以便使用新代码。Laravel 提供了一个统一的 reload Artisan 命令来终止这些服务:

php artisan reload

如果你没有使用 Laravel Cloud,则需要手动配置一个进程监控器,以便在可重载进程退出时能够检测到并自动重启它们。

调试模式

在你的 config/app.php 配置文件中,debug 选项决定了错误信息向用户显示的详细程度。默认情况下,该选项会遵循存储在应用 .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 事件,让您可以执行与您的应用程序相关的额外健康检查。在此事件的 监听器 中,您可以检查应用程序的数据库或缓存状态。如果您检测到应用程序存在问题,您可以简单地从监听器中抛出异常。

使用 Laravel Cloud 或 Forge 部署

Laravel Cloud

如果你希望使用一个为 Laravel 量身打造的全托管、自动扩展的部署平台,可以了解一下 Laravel Cloud。Laravel Cloud 是一个功能强大的 Laravel 部署平台,提供托管的计算资源、数据库、缓存以及对象存储。

将你的 Laravel 应用部署到 Cloud 上,体验可扩展的简洁性。Laravel Cloud 由 Laravel 的开发者精心优化,可与框架无缝配合,让你依然可以像平常一样专注编写 Laravel 应用。

Laravel Forge

如果你更倾向于自行管理服务器,但又不熟悉配置运行强大 Laravel 应用所需的各种服务,那么 Laravel Forge 是一个专为 Laravel 应用设计的 VPS 服务器管理平台。

Laravel Forge 可以在多种基础设施提供商上创建服务器,例如 DigitalOcean、Linode、AWS 等。此外,Forge 会安装并管理构建高可用 Laravel 应用所需的所有工具,包括 Nginx、MySQL、Redis、Memcached、Beanstalk 等。