为什么这些基于pm2的节点进程每隔一两秒就会停止并重新启动?

时间:2016-11-21 00:54:46

标签: node.js pm2

我正在尝试使用PM2,特别是我正在测试是否能够在JSON格式的配置文件中声明我的节点应用程序,如下所示:

{
  "apps": [
    {
      "exec_mode": "cluster_mode",
      "script": "./server.js",
      "name": "proj-0",
      "watch": true,
      "max_memory_restart": "500G",
      "env": {
        "NODE_ENV": "development",
        "PORT": 3000
      },
      "error_file": "./logs/proj-0_test.err.log",
      "out_file": "./logs/logs/proj-0_test.out.log"
    },
    {
      "exec_mode": "cluster_mode",
      "script": "./server2.js",
      "name": "proj-1",
      "watch": true,
      "max_memory_restart": "500G",
      "env": {
        "NODE_ENV": "development",
        "PORT": 3001
      },
      "error_file": "./logs/proj-1_test.err.log",
      "out_file": "./logs/logs/proj-1_test.out.log"
    }
  ]
}

当我使用CLI命令启动pm2时:

pm2 start configuration_test.json

...它最初开始很好,然后每隔一秒左右在停止,停止和启动之间交替(当我使用pm2 monit监视它时)

我检查了错误日志,我反复看到:

RangeError: "port" argument must be >= 0 and < 65536

继承我正在测试的节点服务器中包含的js(server.js和server2.js):

var http = require('http');
var process = require('process');

http.createServer(function(req, res) {  
  res.writeHead(200);
  res.end("hello world.  PID: " + process.pid + ".  " +     process.env.NODE_PORT);
}).listen(process.env.NODE_PORT);

注意:我尝试了process.env.NODE_PORT和process.env.port

此外,当我使用以下内容专门设置端口并运行节点进程时,它运行正常。

.listen(3000);

为什么端口分配似乎无效(基于我在错误日志中看到的内容)?为了实现这一目标,我需要改变什么?

我正在使用pm2版本2.1.5和Node.js版本6.2.2。

2 个答案:

答案 0 :(得分:0)

这可能完全不相关,但是直到我从json文件中除了env部分之外的所有键中删除双引号之后,pm2才对我有效。

所以它看起来像:

max_memory_restart: "500G",
env : {
    "NODE_ENV": "development",
    "PORT": 3000
},

同样,您的系统可能不是问题,但pm2不能正确解析我的json。我的例子是pm2在他们的快速入门指南中的显示方式。

另一个选择,就是我走的路线,就是在单独的配置json中加载你的配置,并在你的节点应用程序中需要它。

config = require("config.json");
.listen(config.port)

这样做可以充分利用pm2的监视功能。您当前将pm2的监视设置为true的情况,如果您只希望在配置更改时重新加载,则可以将其设置为     观看:&#34; config.json&#34;

然后,如果您需要进行配置更改,您可以进行更改,保存并pm2将为您重新启动应用程序。如果您需要更改其运行的端口等配置,则非常方便。您可以修改应用程序配置,让pm2重新启动应用程序,而不是修改pm2配置并停止/重新启动容器,这通常比停止/启动容器快得多。

答案 1 :(得分:0)

基本上,您的节点应用中存在一些错误。默认情况下,当PM2启动您的节点应用程序并退出时出现错误,PM2将自动尝试重新启动它。因此,您可能会发现运行PM2 ls表明您的应用程序会继续重新启动。如果你没有在配置文件中设置限制,它可能会继续,直到你手动终止进程