如何在PM2 cluster模式下启动监听80端口的Node服务器程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在PM2 cluster模式下启动监听80端口的Node服务器程序相关的知识,希望对你有一定的参考价值。

参考技术A angularjs 是前端框架node是服务端js运行环境两者没啥关系,只不过配合使用可以同意前后端开发语言,不想用node用别的也行,甚至没有后端服务器也行

node.js集群模块如何允许多个子进程监听同一个端口?

【中文标题】node.js集群模块如何允许多个子进程监听同一个端口?【英文标题】:How does node.js cluster module allow multiple child process to listen on the same port? 【发布时间】:2020-04-09 04:24:12 【问题描述】:

使用 Node.JS 和 cluster 模块。

我试图了解多个分叉子进程如何在同一个端口上侦听。

例如,使用cluster 模块我们可以这样做:

const port = 443;
...
if (cluster.isMaster) 
    for(let i = 0; i < numCPUs; i++)
    
        cluster.fork();
    
...

else // Forked child processes:

... 
    https.createServer(
        key: fs.readFileSync('server.key'),
        cert: fs.readFileSync('server.cert')
    , app)
    .listen(port, () => 
        console.log(`HTTPS Listening on port $port`);
    );


这段代码分叉了多个进程,所有进程都在同一个端口上调用listen。我不清楚所有进程如何绑定同一个端口并且仍然能够确定哪个进程获得端口流量。这实际上是一种错觉吗?相反,主进程实际上是唯一一个绑定端口并将请求随机传递给分叉子进程的进程? (如果是这种情况,是否会影响性能?)

感谢您帮助我了解所有子进程如何同时侦听同一端口。

请注意,此示例在 Windows 机器上运行,但如果我理解正确,它同时兼容 Windows 和 Linux。

【问题讨论】:

【参考方案1】:

来自文档Cluster: How It Works:

cluster 模块支持两种分发传入的方法 连接。

第一个(以及除 Windows 之外的所有平台上的默认值), 是循环方法,主进程监听一个 端口,接受新连接并将它们分发给工作人员 以循环方式,有一些内置的智能可以避免 重载工作进程。

第二种方法是主进程创建监听 套接字并将其发送给感兴趣的工人。然后工人们接受 直接传入连接。

“***”进程是绑定端口的进程。 IPC 通道自动分发给子进程。 "Workers 可以共享 TCP 连接"。

另一个重要的部分是server.listen()exclusive 属性。

如果exclusivefalse(默认),那么集群工作人员将使用 相同的底层句柄,允许连接处理职责 共享。当exclusivetrue 时,句柄不共享,并且 尝试共享端口会导致错误。一个听的例子 在一个专用端口上如下所示。

所以如果你告诉它们是exclusive,那么你可以让它们都尝试(但失败)绑定到同一个端口,但默认情况下(这就是你的示例中的内容),它们共享句柄,允许连接被分发。

【讨论】:

我仍在试图弄清楚集群工作人员如何共享同一个句柄。我知道他们这样做,我只是看不到它在代码中的位置。如 OP 的问题所示,集群的初始化代码仅显示了调用 .listen() 的工作人员,这与主监听和分发相反。这是怎么回事? @jfriend00 我也想弄清楚这一点。我正在研究node/lib/internal/cluster/master.js 如何在queryServer 中创建RoundRobinHandle。似乎有特殊的internalMessage 触发了特殊处理并导致集群使用共享连接。 server.listen() 是否知道集群子状态,所以它并没有真正从头开始监听,而只是与父级通信?我能想到的就这些了。 @RyanGriggs - 嗯,这只是现代操作系统的限制。一个端口上确实只有一个真正的侦听器。幸运的是,master 通常所做的只是调度,这在 TCP 堆栈中已经有点瓶颈,所以它不应该以任何有害的方式增加瓶颈。请记住,在这里完成所有实际工作的是子进程。主人应该有足够的空闲时间。 @RyanGriggs - 大规模执行此操作的硬件辅助方法是使用专门的负载均衡器或代理(如 nginx)在一组侦听服务器之间分配请求。然后,您不仅可以在同一台服务器上的不同进程之间进行负载均衡,还可以在不同服务器之间进行负载均衡。所以,有规模的层次。单个服务器上的集群是从单个 node.js 进程扩展的下一层。通过涉及更多硬件,甚至最终涉及边缘服务器和多个数据中心,当然还有更高的层次。

以上是关于如何在PM2 cluster模式下启动监听80端口的Node服务器程序的主要内容,如果未能解决你的问题,请参考以下文章

node多项目同时运行,nginx端口监听转发

大神教你如何解决Linux系统80端口被占用

nginx 不会两次监听 80 端口?

如何启用httpd服务

PM2入门及其常用命令

如何修复监听端口 80 的远程端口转发失败