Skip to content

部署

简介

当您准备将 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 文件移动到项目根目录,因为从项目根目录提供服务会将许多敏感配置文件暴露给公共互联网:

nginx
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 命令即可:

shell
frankenphp php-server -r public/

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

目录权限

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

优化

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

shell
php artisan optimize

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

shell
php artisan optimize:clear

在接下来的文档中,我们将讨论 optimize 命令执行的每个具体优化命令。

缓存配置

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

shell
php artisan config:cache

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

WARNING

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

缓存事件

您应在部署过程中缓存应用程序的自动发现事件到监听器映射。可通过在部署时调用 event:cache Artisan 命令实现:

shell
php artisan event:cache

缓存路由

若您正在构建具有大量路由的大型应用程序,应确保在部署过程中运行 route:cache Artisan 命令:

shell
php artisan route:cache

此命令将所有路由注册缩减为缓存文件中的单一方法调用,提升注册数百个路由时的性能。

缓存视图

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

shell
php artisan view:cache

此命令预编译所有 Blade 视图,使其无需按需编译,从而提升返回视图的每个请求的性能。

调试模式

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

> **在生产环境中,此值应始终为 `false`。若在生产环境中将 `APP_DEBUG` 变量设置为 `true`,您可能会将敏感配置值暴露给应用程序的最终用户。**

健康路由

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

默认情况下,健康检查路由位于 /up,若应用程序启动时未发生异常,将返回 200 HTTP 响应;否则返回 500 HTTP 响应。您可在应用程序的 bootstrap/app 文件中配置此路由的 URI:

php
->withRouting(
    web: __DIR__.'/../routes/web.php',
    commands: __DIR__.'/../routes/console.php',
    health: '/up', // [tl! remove]
    health: '/status', // [tl! add]
)

当对此路由发起 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 等。