简介

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

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.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_buffer_size 32k;
        fastcgi_buffers 8 32k;
        fastcgi_busy_buffers_size 64k;
        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 视图,使其无需按需编译,从而提升每个返回视图的请求的性能。

重载服务

当部署到 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 部署平台,提供托管计算、数据库、缓存以及对象存储服务。

在 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 等。