使用 nginx 作為 HTTP 負載平衡器
負載平衡方法 預設負載平衡配置 最少連線負載平衡 Session 持久性 加權負載平衡 健康檢查 延伸閱讀 |
簡介
跨多個應用程式實例進行負載平衡是一種常用的技術,用於最佳化資源利用率、最大化吞吐量、減少延遲,並確保容錯配置。
可以使用 nginx 作為一個非常高效的 HTTP 負載平衡器,將流量分配到多個應用程式伺服器,並使用 nginx 提高 Web 應用程式的效能、可擴展性和可靠性。
負載平衡方法
nginx 中支援以下負載平衡機制(或方法)
- round-robin(循環):對應用程式伺服器的請求以循環方式分配。
- least-connected(最少連線):下一個請求被分配到活動連線數最少的伺服器。
- ip-hash:使用雜湊函數來決定下一個請求應選擇哪個伺服器(基於客戶端的 IP 位址)。
預設負載平衡配置
使用 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_pass、uwsgi_pass、scgi_pass、memcached_pass 和 grpc_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_upstream、backup、down 和 keepalive。如需更多資訊,請查看我們的參考文件。
最後但同樣重要的是,應用程式負載平衡、應用程式健康檢查、活動監控和伺服器群組的動態重新配置可作為我們的付費 NGINX Plus 訂閱的一部分使用。