2017-02-15 65 views
0

我的机器上有3个cpu核心,并且我有3个节点正在运行,每个核心都有一个节点。当我直接访问这样的服务器时,这是一个总是被调用的主进程。但是,当我使用反转的nginx代理时,该过程是随机的。 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; 
    } 
} 
+0

https://www.nginx.com/resources/admin-guide/load-balancer/#method – Matt

+0

是的,但这里的负载均衡用于不同的端口(服务器)。在我的情况下,nginx在同一个端口上平衡多个进程。 – user99999

+0

Nginx只能在多个后端进行负载平衡。它不了解节点群集。您可能会问的问题是“为什么我的节点集群对nginx的响应与直接访问时相比有所不同?”。如果包含你的集群代码。我怀疑答案是你的浏览器在直接进入时保持tcp连接是活着的。 – Matt

回答

0

Nginx已经没有后端的集群已经配置的方式的知识。正如您对原始问题的评论中所指出的那样,Nginx负载平衡仅适用于您将其配置为具有多个后端的情况。你没有这样做。

因此,如果您的后端本身与使用群集模块的NodeJS类似,那么负载平衡就是在那里发生的。 Node不需要Nginx的任何“帮助”来做到这一点 - 它有自己的机制。它们在https://nodejs.org/api/cluster.html#cluster_how_it_works中描述:

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

第一个(除Windows以外的所有平台上都是默认的)是循环法,主进程侦听端口,接受新连接并以循环方式在工作人员之间分配它们,有一些内置的智能,以避免过载工作进程。

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

因此,您可以选择如何在Node后端工作。目前,你告诉Nginx总是要进入2000端口,因此无论你在哪里运行,都会获得流量。如果这是节点群集的主进程,它将循环负载均衡。如果那是一个童工,那么这个童工将获得所有的交通,其他人将不会得到任何交通。