使用 NGINX 和 NGINX Plus 實現負載均衡(第 1 部分)

本文將指導您配置 NGINX 以將流量負載均衡到一組 Web 伺服器,並重點介紹了 NGINX Plus 的一些其他功能。

NGINX 是功能強大的加速代理,適用於眾多基於 HTTP 的應用。 其緩存、HTTP 連接處理及卸載功能可顯著提高應用性能,尤其是在高負載期間。

編者按——NGINX Plus Release 5 及更高版本還可以對基於 TCP 的應用進行負載均衡。 Release 6 通過增添健康檢查、動態重新配置、SSL 終止等功能,顯著擴展了 TCP 負載均衡。 在 NGINX Plus Release 7 及更高版本中,TCP 負載均衡器具備與 HTTP 負載均衡器一樣的功能。 Release 9 中引入了對 UDP 負載均衡的支援。

您可以在 stream 上下文(而非 HTTP 上下文)中配置 TCP 和 UDP 負載均衡。 由於 HTTP 和 TCP/UDP 之間的固有差異,可用指令和參數略有不同。

NGINX Plus 擴展了 NGINX 開源版的功能,增加了更多負載均衡的功能:健康檢查、會話保持、即時活動監控及負載均衡伺服器組的動態配置。

本文將指導您配置 NGINX 以將流量負載均衡到一組 Web 伺服器,並重點介紹了 NGINX Plus 的一些其他功能。

使用NGINX 代理流量

首先,我們將流量代理到一對上游Web 伺服器。下列NGINX 設定可終止所有向80 連接埠發出的HTTP 請求,並在上游群組的Web 伺服器之間以輪詢方式轉送這些請求:

http {
    server {
        listen 80;

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

    upstream backend {
        server web-server1:80;
        server web-server2:80;
    }
}

透過此簡單配置,NGINX 會將在80 連接埠收到的每個請求依序轉送至web-server1 和web-server2,並分別建立新的HTTP 連線。

設定負載平衡方法

預設情況下,NGINX 採用輪詢方法在伺服器之間均勻地分配流量,並基於分配給每台伺服器的可選「權重」來表示其相對容量。

IP 哈希方法根據來源IP 位址的哈希值分配流量。來自同一客戶端IP 位址的請求始終傳送到同一上游伺服器。這是一種粗略的會話保持方法,每當伺服器發生故障或恢復時,或者每當上游群組被修改時,它都會被重新計算。對於需要會話保持的場景,NGINX Plus 提供了更好的解決方案。

最少連接方法將每個請求路由到活動連接最少的上游伺服器,適用於處理快速且複雜的請求。

所有負載平衡方法均可使用server 指令中的可選weight 參數進行調整。當伺服器的處理能力不同時,這項調整很有必要。在下面的範例中,NGINX 定向到web-server2 的請求數是定向到web-server1 的請求數的四倍:

upstream backend {
    zone backend 64k;
    least_conn;

    server web-server1 weight=1;
    server web-server2 weight=4;
}

在NGINX 中,權重由每個worker 流程​​獨立管理。 NGINX Plus 使用共享記憶體分段處理上游資料(透過zone 指令進行配置),因此worker 之間可以共享權重,而且流量分配也更精確。

故障檢測

如果NGINX 在嘗試連接伺服器、向伺服器發送請求或讀取回應頭時發生錯誤或逾時,NGINX 便會向另一台伺服器重試連線請求。 (您可以將proxy_next_upstream 指令新增至設定中,以定義重試請求的其他條件。) 此外,NGINX 還可以將故障伺服器從潛在伺服器群組中移除,並且不會定期嘗試對其發出請求以偵測它是否已恢復。 server 指令的max_fails 和fail_timeout 參數控制此行為。

NGINX Plus 不僅增加了一組帶外健康檢查,可對每台上游伺服器執行複雜的HTTP 測試,以確定其是否處於活動狀態,而且還採用了一種慢啟動機制,能夠逐步將恢復的伺服器重新引入負載平衡組:

server web-server1 slow_start=30s;

常見問題— 修復Host 請求header

通常,上游伺服器會使用請求中的Host 請求header來決定要提供的內容。如果伺服器意外傳回404 錯誤或其他任何提示伺服器提供錯誤內容的訊息,那麼首先要檢查該請求header。然後,將proxy_set_header 指令加入到組態中,為請求頭設定對應的值:

location / {
    proxy_pass http://backend;

    # Rewrite the 'Host' header to the value in the client request
    # or primary server name
    proxy_set_header Host $host;

    # Alternatively, put the value in the config:
    #proxy_set_header Host www.example.com;
}

使用NGINX Plus 實現進階負載平衡

NGINX Plus 具有一系列進階功能,是部署在上游伺服器群之前的理想負載平衡器:

  • 負載平衡和會話保持— 對worker 進程進行更合理的負載平衡並採用會話保持方法,以識別並支援應用程式會話
  • HTTP 健康檢查和伺服器慢啟動— 透過非同步「綜合事務」探測每台上游伺服器的正常運作情況,並在伺服器復原時以優雅的「慢啟動」方式重新引入伺服器
  • 即時活動監控— 即時報告活動與效能
  • 動態設定的上游伺服器群組— 用於執行一些常見上游管理任務(例如安全地暫時移除伺服器)的工具

如欲試用NGINX Plus,請點擊此處立即下載30 天免費試用版。

文章來源:NGINX