使用 nginx 作為 HTTP 負載平衡器

負載平衡方法
預設負載平衡配置
最少連線負載平衡
Session 持久性
加權負載平衡
健康檢查
延伸閱讀

簡介

跨多個應用程式實例進行負載平衡是一種常用的技術,用於最佳化資源利用率、最大化吞吐量、減少延遲,並確保容錯配置。

可以使用 nginx 作為一個非常高效的 HTTP 負載平衡器,將流量分配到多個應用程式伺服器,並使用 nginx 提高 Web 應用程式的效能、可擴展性和可靠性。

負載平衡方法

nginx 中支援以下負載平衡機制(或方法)

預設負載平衡配置

使用 nginx 進行負載平衡的最簡單配置可能如下所示

http {
    upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;

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

在上面的例子中,有 3 個相同的應用程式實例在 srv1-srv3 上執行。當未明確配置負載平衡方法時,預設為循環。所有請求都會代理到伺服器群組 myapp1,並且 nginx 會應用 HTTP 負載平衡來分配請求。

nginx 中的反向代理實作包括 HTTP、HTTPS、FastCGI、uwsgi、SCGI、memcached 和 gRPC 的負載平衡。

要為 HTTPS 而不是 HTTP 配置負載平衡,只需使用 "https" 作為協議即可。

為 FastCGI、uwsgi、SCGI、memcached 或 gRPC 設定負載平衡時,請分別使用 fastcgi_passuwsgi_passscgi_passmemcached_passgrpc_pass 指令。

最少連線負載平衡

另一種負載平衡規則是最少連線。當某些請求需要較長時間才能完成時,最少連線允許更公平地控制應用程式實例上的負載。

透過最少連線負載平衡,nginx 會嘗試避免過多的請求使繁忙的應用程式伺服器過載,而是將新請求分配到較不繁忙的伺服器。

least_conn 指令作為伺服器群組配置的一部分使用時,會在 nginx 中啟用最少連線負載平衡

    upstream myapp1 {
        least_conn;
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

Session 持久性

請注意,使用循環或最少連線負載平衡時,每個後續客戶端的請求都可能會分配到不同的伺服器。無法保證同一客戶端始終被導向到同一伺服器。

如果需要將客戶端綁定到特定的應用程式伺服器,也就是說,使客戶端的 Session 在始終嘗試選擇特定伺服器方面是「黏性的」或「持久的」,則可以使用 ip-hash 負載平衡機制。

使用 ip-hash 時,客戶端的 IP 位址會用作雜湊鍵,以決定應為客戶端的請求選擇伺服器群組中的哪個伺服器。此方法確保來自同一客戶端的請求始終被導向到同一伺服器,除非該伺服器不可用。

要配置 ip-hash 負載平衡,只需將 ip_hash 指令新增至伺服器(上游)群組配置即可

upstream myapp1 {
    ip_hash;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
}

加權負載平衡

也可以透過使用伺服器權重來進一步影響 nginx 負載平衡演算法。

在上面的例子中,未配置伺服器權重,這表示所有指定的伺服器都被視為符合特定負載平衡方法的資格。

尤其是在循環中,這也表示請求在伺服器之間的分配或多或少相等,前提是有足夠的請求,並且請求以統一的方式處理並能足夠快速地完成。

當為伺服器指定 weight 參數時,權重會作為負載平衡決策的一部分考慮在內。

    upstream myapp1 {
        server srv1.example.com weight=3;
        server srv2.example.com;
        server srv3.example.com;
    }

透過此配置,每 5 個新請求將如下分配到應用程式實例:3 個請求將被導向到 srv1,一個請求將被導向到 srv2,另一個請求則被導向到 srv3。

類似地,在最新版本的 nginx 中,也可以將權重與最少連線和 ip-hash 負載平衡一起使用。

健康檢查

nginx 中的反向代理實作包括頻內(或被動)伺服器健康檢查。如果來自特定伺服器的回應失敗並出現錯誤,nginx 會將此伺服器標記為失敗,並嘗試避免在一段時間內為後續的傳入請求選擇此伺服器。

max_fails 指令會設定在 fail_timeout 期間與伺服器連線時,應該發生的連續不成功嘗試次數。預設情況下,max_fails 設定為 1。當設定為 0 時,會停用此伺服器的健康檢查。fail_timeout 參數還定義伺服器標記為失敗的時間長度。在伺服器故障後的 fail_timeout 間隔之後,nginx 將開始使用活動客戶端的請求來正常探查伺服器。如果探查成功,則會將伺服器標記為活動伺服器。

延伸閱讀

此外,還有更多指令和參數可以控制 nginx 中的伺服器負載平衡,例如 proxy_next_upstreambackupdownkeepalive。如需更多資訊,請查看我們的參考文件

最後但同樣重要的是,應用程式負載平衡、應用程式健康檢查、活動監控和伺服器群組的動態重新配置可作為我們的付費 NGINX Plus 訂閱的一部分使用。