使用PM2时如何配置master进程

How can we configure master process when using PM2

我在 NodeJS 中遇到 PM2 问题。 没有pm2,我们总是有一些代码行来配置主进程

if(cluster.isMaster){
    //master process configuration
} else {
    //worker process configuration
}

没错,我想从一个worker发送消息给master,然后master会发回消息给所有worker,通知一个事件。

实际上,我看到,使用 PM2 时,master 进程配置中没有代码行运行。

非常感谢您对此问题的任何想法!

使用 PM2,您通常不必使用此构造。通常,它如下所示:

var cluster = require('cluster');  
var http    = require('http');  
var os      = require('os');
var numCPUs = os.cpus().length;

if(cluster.isMaster){
  for (var i = 0; i < numCPUs; ++i) {
    cluster.fork();
  }
} else {
  http.createServer(function(req, res) {
    res.writeHead(200);
    res.end("hello world");
  }).listen(8080);
}

对于 PM2,上面的等价物是:

var http = require('http');

http.createServer(function(req, res) {  
  res.writeHead(200);
  res.end("hello world");
}).listen(8080);

pm2 start app.js -i <number of instances>

您可以阅读有关该主题的更多信息 here

Update: 你可以尝试通过传递命令行参数来区分master和slave。 这是一个例子 ecosystem.json:

{
  "apps" : [
    {
      "name": "Master",
      "script": "app.js",
      "args": ["master"],
      "instances": "1",
    },
    {
      "name": "Slave",
      "script": "app.js",
      "args": ["slave"],
      "instances": "3"
    }
  ],
...

那么您可以进行以下操作:

argv = process.argv.slice(2) //stripe 'node', 'app.js' away

if (argv[0] === 'master'){
   // ...
} else {
  // ...
}

PM2内部使用"cluster"创建子进程,然后自己充当master,不对外提供任何功能。您仍然可以使用以下代码来创建进程,但是 cluster.isMaster 始终为 false。

if(cluster.isMaster){
  ...
  cluster.fork();
  ...
} else {
  ...
}

除非你这样开始:pm2 start -x app.js https://github.com/Unitech/pm2/issues/363

PM2的设计不错,但是给初学者带来了困惑。我们竭尽全力查看文档和 Google 搜索,但很难找到有关设计的任何解释。

如果您使用 PM2 >2.5(即 2017 年 6 月之后),您可以使用 NODE_APP_INSTANCE 环境变量:

if(process.env.NODE_APP_INSTANCE === "0") {
  // the code in here will only be executed on the first instance in the cluster
}

// the code out here will be executed on all instances

此变量仅在集群模式下可用。对于每个添加的新实例,它从零开始计数。我不确定为什么它是字符串而不是整数。

也许这个图书馆可以帮助你 https://github.com/Tomas2D/pm2-master-process

用法很简单:

import { isMasterInstance } from 'pm2-master-process'

if (await isMasterInstance()) {
  console.info(`I am master!`)
} else {
  console.info(`I am a slave.`)
}

PS: 我是图书馆的作者