почему эти процессы узла на основе 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"
    }
  ]
}

Когда я запускаю pm2 с помощью команды CLI:

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.


person tamak    schedule 21.11.2016    source источник
comment
вы пробовали NODE_PORT и port, но пробовали ли вы PORT?   -  person david    schedule 21.11.2016
comment
@david спасибо, да, я сделал.   -  person tamak    schedule 21.11.2016
comment
@david Я также сделал console.log(process); и console.log(process.env), и я вообще не вижу там PORT. Я в тупике!   -  person tamak    schedule 21.11.2016


Ответы (2)


Это может быть совершенно не связано, но pm2 не работал у меня хорошо, пока я не удалил двойные кавычки со всех ключей в файле json, кроме части env.

Так это будет выглядеть так:

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

Опять же, возможно, это не проблема в вашей системе, но в противном случае pm2 не будет правильно анализировать мой json. Мой пример — это то, как pm2 отображается в их кратком руководстве.

Другой вариант, и это путь, по которому я пошел, — загрузить ваши конфигурации в отдельную конфигурацию json и потребовать ее в своем приложении node.

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

Такой подход дает дополнительное преимущество использования возможностей часов pm2. Если вы в настоящее время установили для часов pm2 значение true, если вы хотите, чтобы он перезагружался только при изменении конфигурации, вы можете настроить его для наблюдения: «config.json»

Затем, если вам нужно внести изменения в конфигурацию, вы можете внести изменения, сохранить их, и pm2 перезапустит приложение для вас. Удобно, если вам нужно изменить конфигурацию, например порт, на котором он работает. Вместо того, чтобы изменять конфигурацию pm2 и останавливать/перезапускать контейнер, вы можете изменить конфигурацию приложений и позволить pm2 перезапустить приложение для вас, что, как правило, намного быстрее, чем остановка/запуск контейнера.

person jcalton88    schedule 21.11.2016

По сути, в ваших приложениях узла есть некоторые ошибки. По умолчанию, когда PM2 запускает ваше приложение узла и завершается с ошибкой, PM2 автоматически пытается перезапустить его. Таким образом, вы можете обнаружить, что запуск PM2 ls показывает, что ваше приложение продолжает перезапускаться по отдельности. и если вы не установили ограничение в своем конфигурационном файле, это может продолжаться до тех пор, пока вы вручную не завершите процесс

person Nelson Owalo    schedule 12.08.2017