首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Yarn构建部署时,在NestJS集群模式下运行PM2

使用Yarn构建部署时,在NestJS集群模式下运行PM2
EN

Stack Overflow用户
提问于 2020-12-21 16:21:43
回答 2查看 2.7K关注 0票数 1

从npm迁移到纱线pnp

几个月前,我们开始使用yarn2 (pnpify)作为我们的monorepo,因为node_modules确实增长到了200K包。多亏了yarn2,我们将所有软件包的构建和部署时间从40分钟缩短到4到5分钟,这真是太棒了。

前端包很容易被树抖动和捆绑,以便创建一个小工件并上传到一个存储容器中。

后端包(Nestjs、Rest和GraphQl API)有点棘手,以便在集群模式下使用pm2运行构建。

PM2

使用PM2,您可以在forkcluster模式下运行应用程序。

在同一个端口上运行应用程序时,需要使用cluster模式。

Fork模式在启动第一个分叉(这是完全合法的)后一直说端口已经在使用了。

由于我们使用的是yarn2,所以我们只能使用yarn作为解释器运行我们的应用程序,方法是:

代码语言:javascript
复制
yarn node ./build/main.js

为了有正确的模块解析,因为节点不理解它。

--这就是问题所在:

纱线(和npm)在集群模式下表现不佳。

这是因为您需要使用节点本身作为解释器,而不是纱线(或npm)。

因此,我们得到了下面的ecosystem.config.js

代码语言:javascript
复制
{
    "apps": [
        {
            "args": "node ./build/main.js",
            "exec_mode": "cluster",
            "instances": "max",
            "interpreter": "bash",
            "name": "api",
            "script": "yarn",
            "time": true
        }
    ]
}

我们将我们的部署发送到一个拥有多个CPU核心的VM,并用新的生态系统重新加载pm2服务。所有的东西都是绿色的,但是我们注意到只有一个进程在监听端口3000,所有其他进程都抛出了一个EADDRINUSE错误。纱线会发出错误,而不是抛出错误,因此PM2认为应用程序仍在运行。

或者至少这是我们的结论。

捆绑NestJS是不可能的:捆绑巢

我唯一的解决方案是通过这样的操作来将nestjs本身聚集起来:

代码语言:javascript
复制
import { Injectable } from '@nestjs/common';
import { fork, isMaster, on } from 'cluster';
import * as os from 'os';

const numCPUs = os.cpus().length;
// const randomNumber = (min: number, max: number) =>
//   Math.floor(Math.random() * max) + min;

@Injectable()
export class ClusterService {
  // eslint-disable-next-line @typescript-eslint/ban-types
  static clusterize(callback: Function): void {
    if (isMaster) {
      // eslint-disable-next-line no-plusplus
      for (let i = 0; i < numCPUs; i++) {
        fork();
      }

      on('exit', (worker, code) => {
        fork();
        // eslint-disable-next-line no-console
        console.log(
          `[Cluster] worker[${worker.process.pid}] died with status: [${code}], creating new worker`,
        );
      });
    } else {
      callback();
    }
  }
}

并在单个实例上运行PM2,但这感觉有点奇怪,因为PM2可以为您做到这一点。以更好的方式。

有没有办法用yarn2“弹出”yarn2,这样我们就可以将应用程序作为一个真正的节点进程运行?

是否有一种方法可以在同一端口上以群集模式运行PM2,同时使用yarn作为解释器?

如何在yarn2中抛出错误而不是发出错误,以便PM2创建一个新进程?

..。或者,在gitlab中是否有另一种解决方案只使用npm,而不需要等待40分钟就可以构建包并使用节点解释器n pm2运行nestjs应用程序?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-04 15:07:17

更新

您不需要纱线以纱线的模块分辨率运行应用程序。

在以节点作为解释器运行应用程序时,唯一需要的是要求.pnp.js。将"interpreter_args": "--require /path/to/.pnp.js",添加到pm2配置中

ecosystem.config.js:

代码语言:javascript
复制
{
  "apps": [
    {
      "name": "my-app",
      "script": "./main.js",
      "interpreter_args": "--require /path/to/.pnp.js",
      "exec_mode": "cluster"
     }
  ]
}

现在,您可以执行pm2 start ecosystem.config.js,而不会遇到任何与未找到的节点模块有关的错误。

票数 1
EN

Stack Overflow用户

发布于 2021-06-23 13:42:05

yarn exec pm2 start ecosystem.config.js和不保存pm2进程。pm2只能在npm模式下复活,不会在纱线模式下执行您的脚本。

缺点是您无法使用pm2启动来从pm2重新启动。因此,您需要自己实现一个systemd服务,它将在启动时执行一个yarn pm2:start

2个可能的特征解决方案:

  • yarn2将能够在构建步骤之后弹出.yarn缓存以重新创建node_modules,以便在npm中启动应用程序。
  • pm2将添加一个功能,在纱线中启动应用程序,而不是将npm与集群模式结合起来。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65396323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档