《Nginx官方文件》使用nginx作為HTTP負載均衡
介紹
跨多個應用程式例項進行負載均衡是一種常用的技術,它被用於優化資源的利用率, 最大化吞吐量,減少延遲並確保容錯配置。 可以使用nginx作為一個非常有效的HTTP負載均衡器,將流量分配給多臺應用伺服器,並通過nginx提高Web應用程式的效能,可擴充套件性和高可靠性。負載均衡方法
在nginx中支援以下負載平衡機制(或方法):- round-robin (輪詢)— Nginx以輪詢的方式對收到的請求進行分發
- least-connected(最少連線) — Nginx會把下一個連線分配給具有最小活動連線的伺服器
- ip-hash (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;//對伺服器群進行負載均衡 } } }
在上面的例子中,伺服器srv1-srv3上運行了三個具有相同應用程式的例項. 當負載均衡方法沒有進行特別的配 置
的話,預設為輪詢。這時所有的請求都被nginx代理到伺服器群組myapp1 中,同時nginx使用HTTP負載均衡來對
請求進行分發。
nginx的反向代理可以實現包括HTTP,HTTPS,FastCGI,uwsgi,SCGI和memcached在內的負載均衡
如果想配置HTTPS協議的負載均衡而不是HTTP協議的負載均衡,只需要使用”https”作為協議即可
最小連線負載均衡
另一種負載均衡機制是基於最小連線的。在一些請求需要更長的時間才能完成的情況下,最小連線機制可以更加公正的控制應用程式例項的負載均衡。
使用最小連線的負載均衡,nginx將盡量不會把過多的請求來使忙碌的應用程式伺服器超負荷執行,而是將新的請求分發到不太忙的伺服器。
當使用 least_conn指令作為伺服器組配置的一部分時,將啟用nginx的最小連線負載均衡:
upstream myapp1 {//配置伺服器群組 least_conn;//最小連線機制命令 server srv1.example.com; server srv2.example.com; server srv3.example.com; }
會話永續性
請注意,通過輪詢或最小連線的負載均衡,每個後續客戶端的請求都可能會被分配到不同的伺服器。在這裡並不能保證同一個客戶端始終指向同一個伺服器。
如果需要將客戶端繫結到特定的應用伺服器–換句話說,使客戶端與nginx的會話進行”粘滯”或者” 持久化”,就總是嘗試去選擇一個特定的伺服器而言,ip-hash負載均衡機制在這裡可以被使用。
使用ip-hash 機制,客戶端的ip地址被用作hash表裡的鍵,nginx根據鍵來確定應該為客戶端請求選擇伺服器群組裡的哪一個伺服器。此方法會確保從同一個客戶端發來的請求會始終定向到同一臺伺服器,除非當這臺伺服器出現不可用的時候。
要配置ip-hash負載均衡,只需將ip-hash指令配置到伺服器(upstream)組的配置中。
upstream myapp1 { ip_hash; server srv1.example.com; server srv2.example.com; server srv3.example.com; }
加權負載均衡
還可以通過使用伺服器權重進一步影響nginx負載均衡演算法。
在上面的示例中,伺服器權重沒有配置,這就意味著所有指定的伺服器被看做對特定負載均衡方法具有同等資格。
特別是輪詢使用的時候,這也意味著只要有足夠多的請求,並且以統一的方式處理請求並且完成速度足夠快,這時 通過伺服器進行的請求分配或多或少概率是相等的。
當為伺服器的配置指定權重引數時,權重將會作為負載均衡決策的一部分進行計算。
upstream myapp1 { server srv1.example.com weight=3;// 為此伺服器增加權重 server srv2.example.com; server srv3.example.com; }
通過這種配置,每五個新的請求將會通過應用例項進行分發,如下所示:3個請求將會被分發給srv1,1個請求將會分發給srv2,另一個請求分發給srv3。
在最近的nginx版本中,同樣可以在最小連線和ip-hash機制中使用負載均衡的權重。
健康檢查
nginx 中的反向代理實現包括內帶(或被動)的伺服器執行狀況檢查。如果特定伺服器的響應失敗並出現錯誤, nginx則會把這臺伺服器標記為失效,並會嘗試在一段時間內避免後續入站的請求選擇此伺服器。
該 max_fails 指令設定在fail_timeout期間與nginx伺服器連續的不成功的嘗試連線的通訊數量。預設情況下,
max_fails設定為1,當設定為0時,該伺服器的執行狀況檢查會被禁用。fail_timeout引數還定義了伺服器將被標記為失效的時間。在 伺服器發生故障後的 fail_timeout間隔之後,
nginx將開始以實時客戶端的請求優雅地探測伺服器。如果探測成功,則將伺服器標記為活動的。
延伸閱讀
最後但並非最不重要的是, 應用程式負載平衡, 應用程式執行狀況檢查, 活動監控和 伺服器組 的即時重新配置可 作為我們付費NGINX Plus訂閱的一部分。
以下文章詳細介紹了NGINX Plus的負載均衡: