Nginx負載均衡原理簡介與負載均衡配置詳解
by:授客 QQ:1033553122
測試環境
nginx-1.10.0
負載均衡原理
客戶端向反向代理發送請求,接着反向代理根據某種負載機制轉發請求至目標服務器(這些服務器都運行着相同的應用),並把獲得的內容返回給客戶端,期中,代理請求可能根據配置被發往不同的服務器。

負載均衡配置
測試案例:
如下,分別在兩台服務器(192.168.1.103, 192.168.1.102)上部署了相同的應用,並通過8080端口訪問網站,如下
http://192.168.1.xx:8080/webautotest/xxxxxxx
同時在192.168.1.103上安裝了nginx反向代理,想通過192.168.1.103的80端口來實現對兩個站點的訪問


編輯nginx配置文件(例中為/usr/local/ngnix/conf/nginx.conf),找到http結點,如下,添加帶背景色部分的內容,
http {
upstream myapp1 {
server 192.168.1.103:8080;
server 192.168.1.104:8080;
}
……略
server {
listen 80;
server_name localhost;
……略
location /webautotest/ {
proxy_buffering off;
proxy_pass http://myapp1;
}
}
}
重新加載配置文件
[root@localhost nginx-1.10.0]# /usr/local/ngnix/sbin/nginx -s reload
訪問測試url
如下,訪問相同的頁面,展示來自不同服務器的頁面


說明:
負載均衡方法
nginx提供了以下三種負載均衡機制、方法:
- round-robin — 請求以循環、輪轉的方式分發到應用服務器。
- least-connected — 下一個請求被分配到擁有最少活動連接數的服務器
- ip-hash — 使用一個哈希函數,基於客戶端ip地址判斷下一個請求應該被分發到哪個服務器。
默認的負載均衡配置
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。當不顯示指定負載均衡方法時,默認為round-robin。所有請求都被代理轉發至myapp1服務器組,並根據負載均衡方法來分發請求。
最少連接負載均衡
另一個負載均衡原則為least-connected。當一些請求花費較長時間來完成時,least-connected更“公平”的控制應用程序實例上的負載。
配置了least-connected的負載均衡機制的情況下,nginx會盡量不讓負載繁忙的應用服務器上負載過多的請求,相反的,會把新的請求發送到比較不繁忙的服務器。
配置示例:
upstream myapp1 {
least_conn;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
會話持久性
注意,round-robin或least-connected負載均衡下,每個后續的客戶端可能被分發至不同服務器,不保證相同客戶端的請求總是被發送到相同的服務器。
如果有必要把客戶端綁定至特定服務器,則可使用ip-hash負載均衡機制。
ip-hash機制下,客戶端ip地址被用作hash key來判斷客戶端請求應該發送到哪個服務器,這種方法保證了來自相同客戶端的請求總是發送到相同服務器(如果服務器可用的話)
upstream myapp1 {
ip_hash;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
負載均衡權重
可通過配置服務器權重來影響負載均衡機制。
上面的例子中,都未配置服務器權重,這意味着所有服務器都擁有相同的權重。
針對round-robin負載機制,權重意味着更多或更少的請求傳送至服務器---假設有足夠的請求,且按統一方式處理請求,且足夠快完成請求處理。
配置示例:
upstream myapp1 {
server srv1.example.com weight=3;
server srv2.example.com;
server srv3.example.com;
}
上例配置中,每發送至服務器實例的5個新的請求中,有3個發送到srv1,1個發送到srv2,另1個發送到srv3。
注:當前版本似乎只實現了round-robin機制下的權重設置
健康檢測
nginx反向代理實現包含服務器健康檢查。如果來自特定服務器的響應失敗,報錯,nginx將標記該服務器為failed,一段時間內盡量避免選擇此服務器作為隨后請求的分發服務器。
max_fails機制設置fail_timeout期間,和服務器溝通失敗的連續重試次數,默認為1.當設置為0時,不做服務器健康檢測。fail_timeout定義了服務器被標記為failed的時長。fail_timeout時間間隔過后,nginx將開始使用活動客戶端請求來探測服務器,如果探測成功則標記服務器為活動服務器。
進一步閱讀
In addition, there are more directives and parameters that control server load balancing in nginx, e.g. proxy_next_upstream, backup, down, and keepalive. For more information please check our reference documentation.
Last but not least, application load balancing, application health checks, activity monitoring and on-the-fly reconfiguration of server groups are available as part of our paid NGINX Plus subscriptions.
The following articles describe load balancing with NGINX Plus in more detail:
參考鏈接:
http://nginx.org/en/docs/http/load_balancing.html
https://www.nginx.com/resources/admin-guide/?_ga=1.235398721.1182431122.1462539513
