Проблема конфигурации порта экспресс-сервера в режиме кластера pm2

Проблема: мы запускаем pm2 в режиме кластера, и pm2 запускает столько процессов, сколько имеется ядер процессора, pm2 также пытается запустить столько серверов узлов, сколько имеется ядер процессора, но проблема здесь в том, что он не запускает столько серверов, потому что они все пытаются запустить на том же порту, который 3000, который уже занят сервером первого узла

Мы использовали nginx и прокси его на 3000 порт.

мы используем pm2 в режиме кластера со следующей конфигурацией:

{
  "apps" : [{
    "script"    : "npm",
    "instances" : "max",
    "cwd":"/home/nginx/my-pwa" ,
    "args" : "run start:server:prod",
    "exec_mode" : "cluster",
    "wait_ready": true,
    "kill_timeout" : 4000,
    "watch" : true
  }]
}

run start: server: prod это наш скрипт для запуска сервера

Наш экспресс сервер:

var app = require('../src/app');
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

const http = require('http');
server = http.createServer(app);
server.listen(port));
server.on('error', onError);
server.on('listening', onListening);

function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}

process.on('message', function(msg) {
  if (msg == 'shutdown') {
    server.close();
    process.exit(0);  
  }
});

// Listening logic
function onListening() {
  var addr = server.address();
  var bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
  debug('Listening on ' + bind);
  console.log("Server started on ", bind);
  process.send('ready');
}

Пожалуйста, помогите, это важно для миссии!

4 ответа

Решение

Проблема в том, что pm2 плохо работает с npm. Он не может запустить два сервера узлов, используя скрипт npm. Правильный путь заключается в использовании узла

Мой предыдущий конфиг:

{
  "apps" : [{
    "script"    : "npm",
    "instances" : "max",
    "cwd":"/home/nginx/my-pwa" ,
    "args" : "run start:server:prod",
    "exec_mode" : "cluster",
    "wait_ready": true,
    "kill_timeout" : 4000,
    "watch" : true
  }]
}

Мой новый конфиг:

{
  "apps" : [{
    "script"    : "./server/bin/www",
    "instances" : "max",
    "exec_mode" : "cluster",
    "cwd":"/home/nginx/my-pwa" ,
    "env": {"NODE_ENV" : "production"},
    "name" : "my-pwa"
  }]
}

Как вы видите, я больше не использую "script": "npm". ./server/bin/www содержит мой экспресс-сервер, который pm2 будет выполнять с использованием узла. Теперь pm2 может автоматически обрабатывать кластеризацию. Так как же теперь должен выглядеть вывод? Это делает одного бога, который управляет экземплярами рабочего сервера, которые соответствуют количеству ядер вашего процессора. Вывод на наш сервер: (имеет 2 ядра)

nginx     1363     1  0 05:20 ?        00:00:03 PM2 v2.10.1: God Daemon (/home/nginx/.pm2)
nginx     1373  1363  0 05:20 ?        00:00:09 node /home/nginx/my-pwa/server/bin/www
nginx     1374  1363  0 05:20 ?        00:00:09 node /home/nginx/my-pwa/server/bin/www

Также теперь pm2 reload работает нормально. Когда я вижу журналы при перезагрузке, pm2 сначала запускает новых рабочих, а затем выключает старых.

Для меня меняется exec_mode в cluster_mode работал.

Мой ecosystem.config.js был изменен на что-то вроде этого

apps: [
  {
    script: 'server.js',
    instances: 'max',
    exec_mode: 'cluster_mode' // not 'fork' or 'cluster'
  }
]

Моя проблема заключалась в том, что скрипт нужно было назвать ecosystem.config.jsчто-либо еще не запустится в кластерном режиме. он запустится в разветвленном режиме, но имя файла необходимо для любой другой конфигурации.

Я не думаю, что вы можете использовать кластерный режим pm2 со сценариями npm. Сначала проверьте, действительно ли процесс находится в режиме кластера, используя pm2 list, Если это не так, попробуйте изменить свою конфигурацию, чтобы вызывать скрипт узла напрямую вместо вызова скрипта npm.

Другие вопросы по тегам