像我五歲一樣解釋 Nginx 的負載平衡

像我五歲一樣解釋 Nginx 的負載平衡

我發現了大量有關如何使用上游伺服器將 Nginx 配置為負載平衡器的 DIY 帖子和教程:

upstream backend  {
  ip_hash;
  server 1.2.3.4;
  server 1.2.3.5;
  server 1.2.3.6;
}

server {
  location / {
    proxy_pass  http://backend;
  }
}

但這就是我能找到的配置此架構的範圍。目前,我有一個 Rails 應用程式部署到 3 個後端 VPS 伺服器,我使用 Unicorn 作為我的 HTTP 伺服器。我是否需要將 ruby​​ 與 Rails 應用程式和 Unicorn 一起安裝在負載平衡伺服器上?我需要在每台上游伺服器上安裝 Nginx 嗎?如果是這樣,我該如何配置它們?如果我在架構中引入像 Varnish 這樣的東西,它會去哪裡?在負載平衡器或每個後端之前?

這是我如何組織一切的視覺效果:

                                       +---> backend1 <---+
                                       |                  |
[requests] <---> [Nginx load-balancer]-+---> backend2 <---+-[Database server]
                                       |                  |
                                       +---> backend3 <---+

答案1

簡短回答:

Nginx實際上只有一項工作,該工作就是接受傳入請求並將其傳遞給後端伺服器。

有鑑於此,您的前端伺服器只需要運行nginx,您的後端伺服器只需要運行rails。合理?

現在,如果您的後端和前端都在同一台伺服器上運行,那麼,是的,當然,它也必須安裝在那裡,但從您的圖表來看,我不認為是這種情況。

如果您引入 HTTP 快取軟體,例如Varnish,它會在Nginx和之間Rails,很可能也在後端伺服器上運行。因此請求將遵循以下路徑:

Nqinx -> Varnish -> Rails

答案2

使用 Rails 時,nginx可用於充當多個角色,最常見的是作為 HTTP 負載平衡器或應用程式伺服器前端。您的設置是一種可行的常見設置,但隨著流量增長到更高水平,可能會帶來擴展挑戰。

當您按照您的描述使用少量 VPS 伺服器時,一個 nginx 實例既可以作為傳入流量的主要 HTTP 負載平衡器,又可以作為前端來卸載 Rails 應用伺服器的低階職責(服務靜態檔案、URL 重寫/重定向等)。

nginx 可以在沒有太多資源的情況下處理數千個並發連接,而 Unicorn Rails 應用程式伺服器通常只能為少數並發連接提供服務。隨著規模的擴大,您將需要更多的負載平衡器/前端 nginx 執行個體(以及它們之間的負載平衡方法,例如 DNS 循環或其他機制)。

如果您使用 Amazon AWS 或其他更成熟的託管平台,通常會使用 Elastic Load Balancing (ELB) 等服務作為主要 Web 負載平衡器。每個應用程式伺服器都運行 nginx/Unicorn,利用 nginx 作為前端來卸載每個 Unicorn 的處理負載。由於每台伺服器前面都有大量 ELB,因此更容易擴展。

相關內容