環境:
centos6/7,nginx-1.9.15.
摘要說明:
上一篇主要講述nginx下的一些常用語法;
本章節主要講述nginx的三種負載均衡策略及其相關配置:
步驟:
1.upstream
首先我們看一個負載均衡upstream的配置示例:
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
}
server {
location / {
proxy_pass http://backend;
}
}
從上面我們可以看到:
- upstream是獨立於server的一個配置
- upstream下包含多個server
- upstream可搭配proxy_pass使用
總結,請求到達server,匹配到location,後調用upstream,按照一定規則選擇其中一臺sever進行反向代理;
接下來我們看下upstream和server的主要語法:
upstream
語法:upstream name { ... }
默認值:none
使用字段:http
說明:upstream主要用於設置一羣服務器,可以將upstream放在proxy_pass和fastcgi_pass指令中作爲一個單獨的實體,upstream可以是監聽不同端口的服務器,並且也可以是同時監聽TCP和Unix socket的服務器。
服務器可以指定不同的權重,默認爲1。
server
語法:server name [parameters]
默認值:none
使用字段:upstream
說明:指定後端服務器的名稱和一些參數,可以使用域名,IP,端口,或者unix socket。如果指定爲域名,則首先將其解析爲IP。此外還有下需配置參數
- ·weight = NUMBER - 設置服務器權重,默認爲1。
- ·max_fails = NUMBER - 在一定時間內(這個時間在fail_timeout參數中設置)檢查這個服務器是否可用時產生的最多失敗請求數,默認爲1,將其設置爲0可以關閉檢查,這些錯誤在proxy_next_upstream或fastcgi_next_upstream(404錯誤不會使max_fails增加)中定義。
- ·fail_timeout = TIME - 在這個時間內產生了max_fails所設置大小的失敗嘗試連接請求後這個服務器可能不可用,同樣它指定了服務器不可用的時間(在下一次嘗試連接請求發起之前),默認爲10秒,fail_timeout與前端響應時間沒有直接關係,不過可以使用proxy_connect_timeout和proxy_read_timeout來控制。
- ·down - 標記服務器處於離線狀態,通常和ip_hash一起使用。
- ·backup - (0.6.7或更高)如果所有的非備份服務器都宕機或繁忙,則使用本服務器(無法和ip_hash指令搭配使用)。
示例配置:
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}
注意:如果你只使用一臺上游服務器,nginx將設置一個內置變量爲1,即max_fails和fail_timeout參數不會被處理。如果nginx不能連接到上游,請求將丟失。所以upstream一般使用多臺上游服務器。
2.upstream默認負載策略——輪詢
輪詢:按照訪問時間先後,按照順序訪問不同的後端服務器
#默認負載策略---輪詢,會依次將請求分發到三臺server上
upstream backend {
server 127.0.0.1:8080;
server 127.0.0.1:8888;
server 127.0.0.1:9999;
}
server {
listen 2009;
server_name localhost;
location / {
proxy_pass http://backend;
}
error_page 500 502 503 504 /50x.html;
location /50x.html {
root html;
}
}
這裏需要注意的是upstream中若有服務掛了,upstream就會將請求進行順延,並不會丟失請求,直到服務正常;
3.upstream負載策略——權重
權重的本質還是輪詢,只是在輪詢的同時給每個server加上了輪詢機率;
權重配置的越大,輪詢機率越大,成正比,默認權重爲1;常用於不用配置服務器配置不同權重;
#負載策略---權重,會根據權重將請求按機率分發到後端服務器,權重越高,機率越大,默認權重爲1;若後端服務器掛了則不參與負載
upstream backend2010 {
server 127.0.0.1:8080 weight=3;
server 127.0.0.1:8888 weight=2;
server 127.0.0.1:9999;
}
server {
listen 2010;
server_name localhost;
location / {
proxy_pass http://backend2010;
}
error_page 500 502 503 504 /50x.html;
location /50x.html {
root html;
}
}
上述配置,若服務都正常,訪問6次,會訪問8080端口3次,8888端口2次,9999端口1次
注:需要注意的下,同一個nginx下,upstream的名稱需要保持唯一
4.upstream負載策略——ip哈希
ip_hash
語法:ip_hash
默認值:none
使用字段:upstream
ip_hash 指令將基於客戶端連接的IP地址來分發請求。
哈希的關鍵字是客戶端的C類網絡地址,這個功能將保證這個客戶端請求總是被轉發到一臺服務器上,但是如果這臺服務器不可用,那麼請求將轉發到另外的服務器上,這將保證某個客戶端有很大概率總是連接到一臺服務器。
無法將權重(weight)與ip_hash聯合使用來分發連接。如果有某臺服務器不可用,你必須標記其爲“down”;
#負載策略-ip_hash;根據客戶端ip固定客戶端請求的後端服務器
upstream backend2011 {
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:8888;
server 127.0.0.1:9999 down;
}
server {
listen 2011;
server_name localhost;
location / {
proxy_pass http://backend2011;
}
error_page 500 502 503 504 /50x.html;
location /50x.html {
root html;
}
}
ip_hash主要用於解決session問題,後端服務器若不想做session共享可採用此種策略