嚴(yán)格說Nginx并沒有自帶針對負(fù)載均衡后端節(jié)點的健康檢查功能,但是可以通過默認(rèn)自帶的ngx_http_proxy_module 模塊和ngx_http_upstream_module模塊中的相關(guān)指令來完成當(dāng)后端節(jié)點出現(xiàn)故障時,自動切換到健康節(jié)點。
0x01:ngx_http_proxy_module模塊
- proxy_connect_timeout 指令
語 法: proxy_connect_timeout time;
默認(rèn)值: proxy_connect_timeout 60s;
上下文: http, server, location
該指令的功能是設(shè)置與后端服務(wù)器建立連接的超時時間。應(yīng)該注意超時一般不可能大于75秒。
- proxy_read_timeout指令
語 法: proxy_read_timeout time;
默認(rèn)值: proxy_read_timeout 60s;
上下文: http, server, location
定義從后端服務(wù)器讀取響應(yīng)的超時時間。該超時是指相鄰兩次讀操作之間的最長時間間隔,而不是整個響應(yīng)傳輸完成的最長時間。如果后端服務(wù)器在超時時間段內(nèi)沒有傳輸任何數(shù)據(jù),則連接將被關(guān)閉。
- proxy_next_upstream指令
語 法: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 |http_404 | off ...;
默認(rèn)值: proxy_next_upstream error timeout;上下文: http, server, location
指定在何種情況下一個失敗的請求應(yīng)該被發(fā)送到下一臺后端服務(wù)器節(jié)點。
error:Nginx與后端服務(wù)器建立連接時;或者向后端服務(wù)器發(fā)送請求時;或者從后端服務(wù)器接收響應(yīng)頭時,出現(xiàn)錯誤
timeout:和后端服務(wù)器建立連接時;或者向后端服務(wù)器發(fā)送請求時;或者從后端服務(wù)器接收響應(yīng)頭時,出現(xiàn)超時
invalid_header:后端服務(wù)器返回空響應(yīng)或者非法響應(yīng)頭
http_500:后端服務(wù)器返回的響應(yīng)狀態(tài)碼為500
http_502:后端服務(wù)器返回的響應(yīng)狀態(tài)碼為502
http_503:后端服務(wù)器返回的響應(yīng)狀態(tài)碼為503
http_504:后端服務(wù)器返回的響應(yīng)狀態(tài)碼為504
http_404 :后端服務(wù)器返回的響應(yīng)狀態(tài)碼為404
off :停止將請求發(fā)送給下一臺后端服務(wù)器
需要理解一點的是,只有在沒有向客戶端發(fā)送任何數(shù)據(jù)之前,將請求轉(zhuǎn)給下一臺后端服務(wù)器才是可行的。也就是說,如果在傳輸響應(yīng)到客戶端時出現(xiàn)錯誤或者超時,這類錯誤是不可能恢復(fù)的。
例子:
http {
proxy_next_upstream http_502 http_504 http_404 error timeout invalid_header;
}
0x02:ngx_http_upstream_module模塊
- server指令
語 法: server address [parameters];
默認(rèn)值: —上下文: upstream
max_fails=number:設(shè)定Nginx與服務(wù)器通信的嘗試失敗的次數(shù)。在fail_timeout參數(shù)定義的時間段內(nèi),如果失敗的次數(shù)達到此值,Nginx就認(rèn)為服務(wù)器不可用。在下一個fail_timeout時間段,服務(wù)器不會再被嘗試。失敗的嘗試次數(shù)默認(rèn)是1。設(shè)為0就會停止統(tǒng)計嘗試次數(shù),認(rèn)為服務(wù)器是一直可用的。可以通過指令proxy_next_upstream、fastcgi_next_upstream和 memcached_next_upstream來配置什么是失敗的嘗試。默認(rèn)配置時,http_404狀態(tài)不被認(rèn)為是失敗的嘗試。
fail_timeout=time:設(shè)定服務(wù)器被認(rèn)為不可用的時間段以及統(tǒng)計失敗嘗試次數(shù)的時間段。在這段時間中,服務(wù)器失敗次數(shù)達到指定的嘗試次數(shù),服務(wù)器就被認(rèn)為不可用。默認(rèn)情況下,該超時時間是10秒。
例子:
upstream name {
server 192.168.1.110:8081 max_fails=3 fail_timeout=60s;
server 192.168.1.122:8082 max_fails=3 fail_timeout=60s;
}
采用這個方式需要注意的一點是,如果后端有不健康節(jié)點,負(fù)載均衡器依然會先把該請求轉(zhuǎn)發(fā)給該不健康節(jié)點,然后再轉(zhuǎn)發(fā)給別的節(jié)點,這樣就會浪費一次轉(zhuǎn)發(fā)。