Nginx 負載均衡(配置文件實現,非實時動態)
1,概覽
負載均衡,就是單個服務無法承受訪問壓力的時候,通過一個入口把請求分發到不同的實際
處理業務的服務上。
後端業務中,可以用nginx實現上游服務器負載均衡,把請求分發給不同的服務器。也可以實
現下游數據庫負載
均衡,比如多臺mysql負載均衡,多臺redis負載均衡。
總之,負載均衡,就是通過相應的算法把要處理的業務分給某個服務去處理。要點就是一個入
口,多個服務。
nginx已經提供了負載均衡配置項,下面簡單總結下
2,實現
在 http 指令下配置 upstream
語法:
upstream name { ... }
默認值: —
上下文: http
語法:
server address [parameters];
默認值: —
上下文: upstream
parameters詳解:
weight=num 配置權重
max_fails=number 定Nginx與服務器通信的嘗試失敗的次數,默認爲1
fail_timeout=time 統計失敗嘗試次數的時間段,結合max_fails使用,默認10s
backup 標記爲備用服務器,只有其他服務器出故障,使用此服務器
down 標記服務器永久不可用
反向代理:
proxy_pass url/upstreamName;
上下文:location
例如:
server{
location / {
proxy_pass http://loadbalanceTest;
}
}
例如:
http{
#配置負載均衡服務 weight爲權重,不加權重每個服務的權重默認爲1
#8.8.8.x:9001是http服務
upstream loadbalanceTest {
server 8.8.8.3:9001 weight=5;
server 8.8.8.4:9001;
}
server{
#反向代理
location / {
#代理到loadbalanceTest配置中
proxy_pass http://loadbalanceTest;
}
}
}
3,nginx負載均衡機制
1,輪詢
默認輪詢方式,當接收到請求後,輪流分給內部服務器
此種負載均衡算法適合服務器組內部的服務器都具有相同的配置並且平均服務請求 相對均衡的情況
2,加權輪詢
需要配置weight參數,然後按照權重輪詢
此種負載均衡算法適合給不同性能的服務配置,性能高的服務器可相應權重高一些
3,IP Hash
需要在 upstream 當中配置 ip_hash
這種方式通過生成請求源IP的哈希值,並通過這個哈希值來找到正確的真實服務器,
不需要考慮session共享
注意:也可以不用ip,用其他變量來做hash映射。需要配置hash $value。其中$value可以
爲請求的某個參數。比如用戶id,商品id等等
4,最少連接數
需要在 upstream 當中配置 least_conn 實現最少連接數
不同請求的處理時間肯定不同,如果A服務器有較多連接,而B服務器沒有連接的話,
新進來的請求並不是按照輪詢分配,而是A達到最大連接數的時候將請求分給B。
4,失敗重試
根據上文提到的max_fails=number和fail_timeout=time配合,可以進行失敗重試。
假如:max_fails=2,fail_timeout=60 表示失敗2次之後,60s內不再重試,標記它爲不可用服務器.
過了60s再進行重試。
失敗重試詳情配置:
proxy_next_upstream
語法: proxy_next_upstream type1|type2……;
#type:
error 建立連接,發送請求,接受請求出現錯誤則重試
timeout 超時則重試
invalid_header header非法則重試
http_500 返回對應的狀態碼則重試
http_502
http_503
http_504
http_404
off ...; 停止發送請求
默認值: proxy_next_upstream error timeout; //默認出錯或者超時則重試
上下文: http, server, location
重試其他相關配置:
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連接後端服務器超時時間