2017-02-15 69 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端口,因此無論你在哪裏運行,都會獲得流量。如果這是節點羣集的主進程,它將循環負載均衡。如果那是一個童工,那麼這個童工將獲得所有的交通,其他人將不會得到任何交通。