NGINX 負載均衡

已下線發表於2019-11-17

nginx負載均衡是我們經常用到的,那麼有沒有仔細看一下關於負載均衡的配置引數呢?

負載均衡策略

  • 1.輪詢(預設):
    每一個來自網路中的請求,輪流分配給內部的伺服器,從1到N然後重新開始。此種負載均衡演算法適合伺服器組內部的伺服器都具有相同的配置並且平均服務請求 相對均衡的情況。

  • 2.加權輪詢(weight):根據伺服器的不同處理能力,給每個伺服器分配不同的權值,使其能夠接受相應權值數的服務請求。例如:伺服器A的權值被設計成1,B的權值是3,C的權值是
    6,則伺服器A、B、C將分別接受到10%、30%、60%的服務請求。此種均衡演算法能確保高效能的伺服器得到更多的使用率,避免低效能的伺服器負載過重。

  • 3.ip-hash(ip_hash):
    我們都知道,每個請求的客戶端都有相應的ip地址,該均衡策略中,nginx將會根據相應的hash函式,對每個請求的ip作為關鍵字,得到的hash值將會決定將請求分發給相應Server進行處理。

  • 4.最少連線數(least_conn):
    最少連線,也就是說nginx會判斷後端叢集伺服器中哪個Server當前的 Active Connection 數是最少的,那麼對於每個新進來的請求,nginx將該其分發給對應的Server。

語法

語法: upstream name { ... } 
預設值: —
上下文: http

upstream 指令當中包含server指令
語法: server address [parameters]; 
上下文: upstream

例子:
upstream backend {
    server backend1.example.com:8081 weight=4 max_fails=2 fail_timeout=30s; 
    server backend2.example.com:8080 weight=1;
}
server { 
    location / {
        proxy_pass http://backend; 
    }
}

引數說明:
weight=number 設定伺服器的權重,預設是1,權重越大被訪問機會越大,可以根據機器的配置情況來配置。

max_fails=number 設定Nginx與伺服器通訊的嘗試失敗的次數。在fail_timeout引數定義的時間段內,如果失敗的次數達到此值,Nginx就認為伺服器不 可用。在下一個fail_timeout時間段,伺服器不會再被嘗試。 失敗的嘗試次數預設是1。

預設配置時,http_404狀態不被認為是失敗的嘗試。 可以透過指令proxy_next_upstream 和memcached_next_upstream來配置什麼是失敗的嘗試。

fail_timeout=time
統計失敗嘗試次數的時間段。在這段時間中,伺服器失敗次數達到指定的嘗試次數,伺服器就被認為不可用。預設情況下,該超時時間是10秒。 

backup
標記為備用伺服器。當主伺服器不可用以後,請求會被傳給這些伺服器,配置這個指令可以實現故障轉移。

down 標記伺服器永久不可用,可以跟ip_hash指令一起使用。

即便未設定諸多引數,預設情況下,當其中某個server掛掉之後,nginx還是會把請求分發到正常的server中去。但一般建議我們手動去設定。

proxy_next_upstream 指令

在nginx的配置檔案中, proxy_next_upstream 項定義了什麼情況下進行重試

語法: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | non_idempotent | off ...; 
預設值: proxy_next_upstream error timeout;
上下文: http, server, location

其中:
error 表示和後端伺服器建立連線時,或者向後端伺服器傳送請求時,或者從後端伺服器接收響應頭時,出現錯誤。 

timeout 表示和後端伺服器建立連線時,或者向後端伺服器傳送請求時,或者從後端伺服器接收響應頭時,出現超時。 

invalid_header 表示後端伺服器返回空響應或者非法響應頭

http_500 表示後端伺服器返回的響應狀態碼為500

non_idempotent 通常,如果請求已傳送到上游伺服器,則具有非等冪方法(POST、LOCK、PATCH)的請求不會傳遞到下一個伺服器;啟用此選項可顯式允許重試此類請求;

off 表示停止將請求傳送給下一臺後端伺服器

注意下non_idempotent引數,proxy_next_upstream配置預設轉發get請求,但對於post等請求並無效果,建議配置這一項。

相關

proxy_next_upstream_tries number:設定重試次數,預設0表示不限制,注意此重試次數指的是所有請求次數(包括第一次和之後的重試次數之和)。 

proxy_next_upstream_timeout time: 設定重試最大超時時間,預設0表示不限制。
即在 proxy_next_upstream_timeout 時間內允許 proxy_next_upstream_tries 次重試。如果超過了其中一個設定,則 Nginx 也會結束重試並返回客戶 端響應(可能是錯誤碼)。

proxy_send_timeout 後端伺服器資料回傳時間(代理傳送超時時間)

proxy_read_timeout  連線成功後,後端伺服器響應時間(代理接收超時時間) 

proxy_connect_timeout nginx連線後端的超時時間,一般不超過75s

建議自己動手使用這些引數,試驗一下,加深印象和理解。


技術文章也釋出在自己的公眾號【愛好歷史的程式設計師】,歡迎掃碼關注,謝謝!

愛好歷史的程式設計師

本作品採用《CC 協議》,轉載必須註明作者和本文連結
分享開發知識,歡迎交流。公眾號:開源到

相關文章