我在NodeJS中遇到PM2问题。 没有PM2,我们总是有一些代码行,如下所示配置主进程
if(cluster.isMaster){
//master process configuration
} else {
//worker process configuration
}
确切地说,我想从工作人员向主人发送消息,然后,主人将向所有工作人员发送回信息以通知事件。
实际上,我看到,使用PM2时,主进程配置中没有代码行运行。
非常感谢您对此问题的任何想法!
答案 0 :(得分:6)
使用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
主题的更多信息更新:您可以尝试通过传递命令行参数来区分主服务器和从服务器。 这是一个示例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 {
// ...
}
答案 1 :(得分:2)
如果您使用的PM2> 2.5(即2017年6月之后),则可以使用NODE_APP_INSTANCE env变量:
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
此变量仅在群集模式下可用。对于每个添加的新实例,它从零开始计数。我不确定为什么它是字符串而不是整数。
答案 2 :(得分:1)
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搜索,但很难找到有关设计的任何解释。