使用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: 我是图书馆的作者
我在 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: 我是图书馆的作者