【问题标题】:express server port configuration issue with pm2 cluster mode使用 pm2 集群模式表达服务器端口配置问题
【发布时间】:2018-09-16 10:13:53
【问题描述】:

问题:我们以集群模式启动 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');
}

请帮忙,这是关键任务!

【问题讨论】:

    标签: node.js express pm2 cluster-mode


    【解决方案1】:

    我认为您不能将 pm2 集群模式与 npm 脚本一起使用。首先使用pm2 list 检查进程是否实际处于集群模式。如果不是,请尝试修改配置以直接调用节点脚本而不是调用 npm 脚本。

    【讨论】:

    • 是的,我检查了,进程处于集群模式。
    【解决方案2】:

    问题是 pm2 不能很好地与 npm 配合使用。它无法使用 npm 脚本启动两个节点服务器。正确的方法是使用node

    我之前的配置:

    {
      "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"
      }]
    }
    

    如您所见,我不再使用“脚本”:“npm”。 ./server/bin/www 包含我的快递服务器,pm2 将使用节点执行。现在 pm2 能够自动处理集群。 那么现在的输出应该是什么样子呢? 它使一个神守护进程根据您的 cpu 核心数来管理工作服务器实例。 我们服务器上的输出:(它有 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,而不是cluster?
    • 你能分享你的./server/bin/www 脚本吗?@Gaurav Sobti
    【解决方案3】:

    对我来说,将 exec_mode 更改为 cluster_mode 有效。

    我的生态系统.config.js 变成了这样的东西

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

    【讨论】:

    • 这救了我,cluster_mode 不是cluster!天哪
    【解决方案4】:

    我的问题是脚本需要命名为 ecosystem.config.js 其他任何东西都不会在集群模式下启动。它将以分叉模式启动,但文件名对于任何其他配置都是必需的。

    【讨论】:

      猜你喜欢
      • 2019-07-23
      • 2021-07-29
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      • 2016-04-06
      • 2016-09-07
      • 2022-01-23
      • 2018-01-17
      相关资源
      最近更新 更多