在本文中,我将向您展示如何在铁路上正确部署 Laravel 项目,这是一个为您处理所有系统管理和 DevOps 任务的基础设施平台。

让 Laravel 在铁路上工作很容易,但有一些问题值得深入解释。除非你想像我一样花一整天时间浏览互联网来寻找不存在的解释,否则作为早期采用者的好处!

铁路的特点之一是,每次部署时,您的项目服务器都会用您的新代码重新构建,这意味着存储在文件系统上的所有内容都将被删除。

如果你不熟悉水平扩展架构上的 PHP 部署或蓝绿部署,我们将介绍你需要做的所有配置调整,以使 Laravel 项目正常工作。

1\。首次部署

铁路部署基于 Nixpacks,这是一种开源工具(由铁路团队开发),它可以读取您的项目源代码并创建一个可以运行的兼容映像。

在一个标准的 Laravel 项目中,Nixpacks 将设置 nginx 来处理请求,PHP 设置为项目所需的版本,NodeJS 设置为你最喜欢的包管理器 Yarn、pnpm 或 npm。

创建项目很简单,只需前往Railway.app/new,设置您的帐户,然后选择要部署的存储库。

[新铁路项目](https://res.cloudinary.com/practicaldev/image/fetch/s--T8J1OcpS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/uploads/articles/wlg8qf92de2ctqkwd4x1.png)

如果您授予铁路访问 GitHub 存储库的权限,您会自动获得推送部署设置,非常好。

您的项目现在正在部署,构建步骤应该可以正常工作,但是您将无法访问您的登录页面,因为 Laravel 需要一些环境变量才能运行。

[第一个项目构建](https://res.cloudinary.com/practicaldev/image/fetch/s--5qRKi6k1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/uploads/articles/3nqffbvvzkg0izmegd0r.png)

您可以将.env文件的内容粘贴到原始编辑器中,并使用您希望用于生产的值。

我们还可以告诉 Nixpacks 在使用NIXPACKS_PKGS环境变量构建项目时添加一些依赖项,例如 PHP Redis 与 Redis 服务器通信,PHP GD 与图像文件一起工作。

[项目环境变量](https://res.cloudinary.com/practicaldev/image/fetch/s--AV3L1vS3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/uploads/articles/eb4h751lbs5q5720gj44.png)

您可以在此处搜索个可用软件包以确保您获得正确的语法。

新的部署将自动开始使用提供的环境变量重新构建您的项目。

默认情况下,您的项目将无法公开访问,您可以前往设置面板并使用 SSL 生成铁路子域,或按照说明使用您自己的域。

[铁路子域](https://res.cloudinary.com/practicaldev/image/fetch/s--6uHuFhoa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/o0zueyzjxm9dcqdhbykr.png)

2\。数据库创建

由于文件系统在每次部署时都会重置,因此无法使用像 SQLite 这样的本地数据库。不用担心,Railway 提供 MySQL、PostgreSQL、MongoDB 和 Redis。

在您的铁路项目中,单击 new 按钮,然后选择您喜欢的数据库管理系统。

[新服务](https://res.cloudinary.com/practicaldev/image/fetch/s--Rd2rrmbD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/my572joxllfkuneb40de.png)

创建后,您将能够在 Variables 面板中检索凭据。

[MySQL 凭据](https://res.cloudinary.com/practicaldev/image/fetch/s--TmXB5eRi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/0synf4kvompmlmotfqgq.png)

您可以将这些值复制到 Laravel 项目环境变量中,以让您的代码访问数据库。

[Laravel 数据库环境变量](https://res.cloudinary.com/practicaldev/image/fetch/s--3A9yO0BJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/016c07u1b146xuk121z9.png)

新的部署将使用提供的环境变量自动重建您的项目,并让您的代码访问数据库。请记住,由于我们没有运行 Laravel 的迁移,因此数据库尚未包含任何表。

3\。雷迪斯

没有持久的文件系统意味着缓存、队列和会话的默认 Laravel 驱动程序将无法正常工作,在每次部署时都会断开我们的用户连接。

为了解决这个问题,我们需要 Redis,它可以像我们的 MySQL/PostgreSQL 数据库一样创建。

同样,您需要将 Variables 面板中的凭据复制到.env文件中,并配置 Laravel 会话、缓存和队列以使用 Redis 驱动程序。

[Redis 凭据](https://res.cloudinary.com/practicaldev/image/fetch/s--RNlJ9xFm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/x5apl4d58xgoa6n1vb7j.png)

[Laravel Redis 环境变量](https://res.cloudinary.com/practicaldev/image/fetch/s--umsqsWvN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/jb16wz7evi1zt03l49r6.png)

4\。自定义构建步骤

在部署期间,Nixpack 将安装您的项目依赖项并运行package.jsonbuild 命令来构建资产:

  • 作曲家需要

  • [纱线|npm|pnpm] 安装

  • [yarn|npm|pnpm] 运行构建

如果您提供的是一个简单的静态站点,这很好,但它缺少一些 Laravel 特定的步骤。

最好的方法是设置NIXPACKS_BUILD_CMD环境变量来运行以下命令:

  • [yarn|npm|pnpm] 运行构建

  • php工匠优化

  • php 工匠迁移 --force

请注意,我们需要包含资产构建步骤,否则它将被我们的新命令替换。

[自定义构建环境变量](https://res.cloudinary.com/practicaldev/image/fetch/s--U2HrOdx3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/sy46pdxybdox2v4cl7o6.png)

我在这里通过运行带有&&的链中的每个命令来说明一个简单的方法,但是您可以将所有这些放在 composer 脚本、bash 脚本或 Makefile 中。

5.创建工作服务器

铁路只允许服务器的单个进程,您当前有一个运行 nginx 并为您的 PHP 代码提供服务的 Web 进程。

如果您需要另一个进程在您的应用程序中运行队列作业怎么办?

然后我们只是创建一个新服务器来服务于这个确切的目的!

在您的铁路项目中,单击 new 按钮,然后再次选择您的代码存储库以创建第二个服务器。

复制所有环境变量以确保两个代码实例以相同的配置运行,并覆盖NIXPACKS_START_CMD变量以运行 Laravel 队列工作者而不是 Web 服务器。

[自定义启动环境变量](https://res.cloudinary.com/practicaldev/image/fetch/s--zYokScNV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/7dxtrh4cmukmm5pieslb.png)

您的工作人员现在应该处理您的队列作业。您可以使用不同的配置创建任意数量的工作人员,以满足您的项目需求。

6.使签名的路线有效

如果您之前使用过负载均衡器,您可能已经遇到签名路由的问题。

在设置项目时,Railway 将接收请求并使用 HTTP 协议将其代理到您的服务器。

Request -https-> Railway -http-> Server

进入全屏模式 退出全屏模式

在生成签名路由时,Laravel 会创建完整 URL 的哈希值(将是 https),但是当用户单击链接时,您的代码将使用以http而不是 https 开头的 URL 验证签名哈希,从而使签名无效。

您可以在代码中添加两件事来防止这种情况发生,首先强制使用https协议生成所有 URL。这可以在您的AppServiceProvider引导方法中完成:

public function boot()
{
    if ($this->app->environment('production')) {
        URL::forceScheme('https');
    }
}

进入全屏模式 退出全屏模式

然后我们需要信任铁路代理来服务https,这可以通过将proxies属性设置为通配符*TrustProxies中间件中进行配置:

<?php

namespace App\Http\Middleware;

use Illuminate\Http\Middleware\TrustProxies as Middleware;
use Illuminate\Http\Request;

class TrustProxies extends Middleware
{
    protected $proxies = '*';

    ...
}

进入全屏模式 退出全屏模式

使用通配符可能不是最佳实践,但我找不到铁路 IP 列表,如果你找到了,请告诉我!

7\。蓝绿部署

最后,我们需要使部署零停机。为此,我们需要确保在新部署创建新服务器时,Railway 可以在将用户流量切换到新服务器并关闭之前的服务器之前验证我们的代码是否正常运行。

Railway 提供的健康检查正是这样做的,您可以选择将被请求的路线,当它返回成功代码 (2xx) 时,Railway 将知道您的服务器已准备好接收请求。

[健康检查](https://res.cloudinary.com/practicaldev/image/fetch/s--S0WKy6A6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/7h1qy21o2eh70k9vboiv.png)

结论

我一直在寻找“Vercel for PHP”,Railway 仍然是一个年轻的服务,缺乏一些灵活性,但开发人员的经验弥补了它。我迫不及待地想看到它在接下来的几年里发展!

也就是说,我仍然使用 Laravel Vapor 或 Laravel forge 等服务,它们价格更高,但提供更好的性能、灵活性、配置,并且仍然是我处理严肃专业项目的首选平台。

Logo

CI/CD社区为您提供最前沿的新闻资讯和知识内容

更多推荐