本文爲翻譯文,原文地址:http://nginx.org/en/docs/http/load_balancing.htmlhtml
將請求負載均衡到多個應用實例是一個經常使用的技術,它起到優化資源使用率、最大化吞吐量、下降延遲、保證容錯性。nginx
Nginx是一個很是有效的HTTP負載均衡工具,它將請求分發到多個應用服務器,從而提高Web應用的性能、擴展性、可靠性。算法
Nginx支持如下負載均衡機制:服務器
最簡單的負載均衡配置以下:app
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用負載均衡去分發請求。負載均衡
Nginx的反向代理實現包括給HTTP、HTTPS、FastCGI、uwsgi、SCGI和memcached。memcached
爲HTTPS配置負載均衡,只需用https便可。工具
當爲FastCGI、uwsgi、SCGI、memcached配置負載均衡,分別使用fastcgi_pass、uwsgi_pass、scgi_pass、memcached_pass便可。性能
另外一個負載均衡機制是最少鏈接。在一些請求需耗時較長的場景下,最少鏈接容許更公平地調控應用實例的負載。優化
當使用最少鏈接機制,nginx會經過將新請求分發給不忙的應用實例,使繁忙的應用實例不超載。
當在服務組中使用least_conn指令,nginx會激活最少鏈接機制。
upstream myapp1 { least_conn; server srv1.example.com; server srv2.example.com; server srv3.example.com; }
咱們需注意一點,對於循環、最少鏈接機制,每一個客戶端的請求可能被分到在不一樣的服務器,不保證同一客戶端的請求會被分發到同一臺服務器中。
若是須要綁定一個客戶端的請求總被分發到同一個服務器,可使用IP哈希機制。
在IP哈希機制中,用客戶端的IP計算哈希結果,此結果用於決定應該將請求分發到服務組的哪一個服務器。此機制保證了來自同一客戶端的請求會被分發到同一服務器,除非那服務器是不可用的。
配置IP哈希機制,只需在服務組中使用ip_hash指令。
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; }
在這個配置中,每5個新請求分發到應用實例的請求以下:3個請求會被分發到srv1,一個請求到srv2,一個請求到srv3。
最新版本的nginx,一樣也可使用權限到最少鏈接機制和IP哈希機制中。
Nginx的反向代理實現包括服務器的健康檢查。若是一個服務器返回的響應是錯誤的,nginx會標記此服務器是不可用的,而且會避免將接下來一段時間的請求分發到此服務器。
用max_fails參數設置跟服務器通訊的連續失敗的次數。max_fails默認爲1,當設置爲0時,健康檢查對此服務器不可用。fail_timeout參數定義服務器會被標記爲不可用多長時間。在fail_timeout期間後,nginx會用客戶端的請求優雅地試探服務器,若是探針表示成功,服務器會被標記爲成功的。
此外,有不少指令和參數用來控制服務器負載均衡,好比proxy_next_upstream、backup、down、keepalive。更多信息請查閱文檔。
最後但不是最不重要的,服務組的application_load_balancing、application_health_checks、activity_monitoring、onthe-fly_reconfiguration是可用的。
下列文檔詳細描述nginx Plus負載均衡:略