Node.js nginx如何平衡节点实例的负载

Node.js nginx如何平衡节点实例的负载,node.js,nginx,Node.js,Nginx,我的机器上有3个cpu内核,我有3个运行的节点实例,每个内核一个。当我直接访问这样的服务器时,这是一个总是被调用的主进程。然而,当我使用反向nginx代理时,这个过程是随机的。nginx在哪里选择运行哪个节点进程 http://domain.com:1000 -> proxy http://domain.com:2000 -> node processes Nginx配置: server { listen 1000; server_name node;

我的机器上有3个cpu内核,我有3个运行的节点实例,每个内核一个。当我直接访问这样的服务器时,这是一个总是被调用的主进程。然而,当我使用反向nginx代理时,这个过程是随机的。nginx在哪里选择运行哪个节点进程

http://domain.com:1000 -> proxy
http://domain.com:2000 -> node processes
Nginx配置:

server {
    listen 1000;

    server_name node;

    location / {
        proxy_pass http://domain.com:2000/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

Nginx不知道后端集群的配置方式。正如在针对您的原始问题的评论中所指出的,Nginx负载平衡仅适用于使用多个后端配置它的情况。你没有这样做

因此,如果您的后端本身类似于使用集群模块的NodeJS,那么负载平衡就发生在那里。Node不需要Nginx的任何“帮助”,它有自己的机制。它们的描述如下:

群集模块支持两种分配传入连接的方法

第一种方法(以及除Windows之外的所有平台上的默认方法)是循环方法,主进程侦听端口,接受新连接,并以循环方式将它们分发到工作进程,同时使用一些内置的smarts避免工作进程过载

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


因此,您可以选择希望它在节点后端中的工作方式。目前,您正在告诉Nginx始终转到端口2000,因此无论您在那里运行什么,都会获得流量。如果这是节点集群的主进程,它将循环负载平衡。如果这是其中一个子工作线程,那么该子工作线程将获得所有流量,而其他子工作线程将不会获得任何流量。

是的,但这里的负载平衡用于不同的端口(服务器)。在我的例子中,nginx在同一端口上平衡多个进程。nginx只能跨多个后端进行负载平衡。它不了解节点群集。您可能会问的问题是“为什么我的节点集群对nginx的响应与我直接访问nginx时不同”。如果是这样,请包括您的集群代码。我想答案应该是你的浏览器在直接连接时保持tcp连接的活动状态。顺便说一句,默认情况下节点集群也是循环的。