web-dev-qa-db-ja.com

pm2クラスターモードでのエクスプレスサーバーポート構成の問題

問題:pm2をクラスターモードで起動し、pm2はcpuコアと同じ数のプロセスを起動します。pm2もcpuコアと同じ数のノードサーバーを起動しようとしますが、ここでの問題は、最初のノードサーバーによってすでに占有されている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');
}

助けてください、それはミッションクリティカルです!

6
Gaurav Sobti

問題は、pm2がnpmでうまく機能しないことです。 npmスクリプトを使用して2つのノードサーバーを起動することはできません。正しい方法はノードを使用することです

私の以前の設定:

{
  "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はクラスタリングを自動的に処理できるようになりました。では、出力はどのようになっているのでしょうか。 CPUコアの数に応じてワーカーサーバーインスタンスを管理する1つの神デーモンを作成します。サーバーへの出力:(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のリロードが正常に機能するようになりました。リロード時にログが表示されると、pm2は最初に新しいワーカーを開始し、次に古いワーカーをシャットダウンします。

10
Gaurav Sobti

私にとってはexec_modeからcluster_mode働いた。

私のecosystem.config.jsはこのようなものに変更されました

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