【问题标题】:How ports work when scaling server using nodejs pm2使用 nodejs pm2 扩展服务器时端口如何工作
【发布时间】:2016-12-13 03:28:58
【问题描述】:

我正在学习如何在我设置的小沙盒中扩展服务器。这是非常简单的代码:

'use strict';

const express = require('express');
const bodyParser = require('body-parser');
const app = express();

const instanceId = parseInt(Math.random() * 1000);

//Allow all requests from all domains & localhost
app.all('/*', function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Accept");
  res.header("Access-Control-Allow-Methods", "POST, GET");
  next();
});

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));

app.get('/', function(req, res) {
  console.log(`[${new Date()}] ${req.method} ${req.originalUrl} from ${req.ip} at ${instanceId}`);
  res.send(`received at ${Date.now()} from ${instanceId}`);
});

app.listen(6069);

没什么疯狂的,只是吐出日期和收到请求的实例。

用于扩展 nodejs 服务器的 pm2 文档建议我运行:

pm2 start server.js -i 5

效果很好。这是我使用 npm 模块 loadtest 对其进行压力测试时的示例输出:

server-0 [Sun Aug 07 2016 00:13:53 GMT-0400 (EDT)] GET / from ::ffff:127.0.0.1 at 847
server-1 [Sun Aug 07 2016 00:13:53 GMT-0400 (EDT)] GET / from ::ffff:127.0.0.1 at 261
server-3 [Sun Aug 07 2016 00:13:53 GMT-0400 (EDT)] GET / from ::ffff:127.0.0.1 at 328
server-2 [Sun Aug 07 2016 00:13:53 GMT-0400 (EDT)] GET / from ::ffff:127.0.0.1 at 163
server-4 [Sun Aug 07 2016 00:13:53 GMT-0400 (EDT)] GET / from ::ffff:127.0.0.1 at 351
server-0 [Sun Aug 07 2016 00:13:53 GMT-0400 (EDT)] GET / from ::ffff:127.0.0.1 at 847
server-3 [Sun Aug 07 2016 00:13:53 GMT-0400 (EDT)] GET / from ::ffff:127.0.0.1 at 328
server-1 [Sun Aug 07 2016 00:13:53 GMT-0400 (EDT)] GET / from ::ffff:127.0.0.1 at 261
server-2 [Sun Aug 07 2016 00:13:53 GMT-0400 (EDT)] GET / from ::ffff:127.0.0.1 at 163
server-4 [Sun Aug 07 2016 00:13:53 GMT-0400 (EDT)] GET / from ::ffff:127.0.0.1 at 351
server-0 [Sun Aug 07 2016 00:13:53 GMT-0400 (EDT)] GET / from ::ffff:127.0.0.1 at 847
server-3 [Sun Aug 07 2016 00:13:53 GMT-0400 (EDT)] GET / from ::ffff:127.0.0.1 at 328

这是我的问题。为什么节点没有抛出端口 6069 正在使用的错误?多台服务器正在尝试使用该端口——但没有任何抱怨。为什么?

【问题讨论】:

    标签: node.js server port scalability pm2


    【解决方案1】:

    PM2 创建了它自己的“嵌入式负载平衡器,它使用循环算法更好地在工作人员之间分配负载”。所以它基本上在你的应用周围包裹了一个负载均衡器,并将请求代理到它创建的每个节点。

    当使用 Round-robin 调度策略时,master accept() all 传入连接并发送该特定的 TCP 句柄 连接到选定的工作人员(通过IPC)。

    【讨论】:

    • 那么app.listen(6069) 到底是怎么回事?为什么没有端口冲突?
    • 因为它使用 Node 的集群模块来分叉到多个工人。请注意,您通常不应使用超过可用 CPU require('os').cpus().length 的工作程序。在此处阅读有关 Node.js 集群的更多信息:nodejs.org/api/cluster.html
    • 谢谢,我正在寻找更多与您的评论相符的内容。这个问题也有助于澄清stackoverflow.com/questions/1568786/…。基本上,在特定端口上在accept 之前调用fork 是完全可以的。
    猜你喜欢
    • 2015-12-04
    • 2017-03-06
    • 2018-06-22
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2023-01-31
    • 2012-05-05
    • 2019-07-13
    相关资源
    最近更新 更多