nginx之健康檢查
正常情況下,nginx做反向代理,如果后端節(jié)點(diǎn)服務(wù)器宕掉的話,nginx默認(rèn)是不能把這臺realserver踢出upstream負(fù)載集群的,所以還會有請求轉(zhuǎn)發(fā)到后端的這臺realserver上面,這樣勢必造成網(wǎng)站訪問故障。雖然nginx可以在localtion中啟用proxy_next_upstream來解決返回給用戶的錯誤頁面,如下:
以上的配置大家可以參考一下,但這個還是會把請求轉(zhuǎn)發(fā)給這臺服務(wù)器的,然后再轉(zhuǎn)發(fā)給別的服務(wù)器,這樣以來就浪費(fèi)了一次轉(zhuǎn)發(fā),對于網(wǎng)站性能來說也不是最佳理想的方案。為了避免上面說顧慮的情況,可以對nginx后方realserver的健康狀態(tài)進(jìn)行檢查,如果發(fā)現(xiàn)后端服務(wù)器不可用,則請求不轉(zhuǎn)發(fā)到這臺服務(wù)器。
目前主要有三種方式可以實(shí)現(xiàn)對nginx負(fù)載均衡的后端節(jié)點(diǎn)服務(wù)器進(jìn)行健康檢查:
1)ngx_http_proxy_module模塊和ngx_http_upstream_module模塊(這是nginx自帶模塊)
參考地址:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream
2)nginx_upstream_check_module模塊(淘寶技術(shù)團(tuán)隊開發(fā))
參考地址:https://github.com/yaoweibin/nginx_upstream_check_module
3)ngx_http_healthcheck_module模塊
------------------------------------------------------------------------------------------------------------------------
一、利用nginx自帶模塊ngx_http_proxy_module和ngx_http_upstream_module對后端節(jié)點(diǎn)做健康檢查
嚴(yán)格來說,nginx自帶是沒有針對負(fù)載均衡后端節(jié)點(diǎn)的健康檢查的,但是可以通過默認(rèn)自帶的ngx_http_proxy_module模塊和ngx_http_upstream_module模塊中的相關(guān)指令來完成當(dāng)后端節(jié)點(diǎn)出現(xiàn)故障時,自動切換到健康節(jié)點(diǎn)來提供訪問。下面列出這兩個模塊中相關(guān)的指令:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
1)ngx_http_proxy_module模塊中的 proxy_connect_timeout指令、proxy_read_timeout指令和proxy_next_upstream指令
語法: proxy_connect_timeout time;
默認(rèn)值: proxy_connect_timeout 60s;
上下文: http, server, location
設(shè)置與后端服務(wù)器建立連接的超時時間。應(yīng)該注意這個超時一般不可能大于75秒。
語法: 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 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ù)器:
error 和后端服務(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ù)器
需要理解一點(diǎn)的是,只有在沒有向客戶端發(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;
}
---------------------------------------------------------------------------------------
2)ngx_http_upstream_module模塊中的server指令
語法: server address [parameters];
默認(rèn)值: ―
上下文: upstream
范例如下:
upstream name {
server 10.1.1.110:8080 max_fails=1 fail_timeout=10s;
server 10.1.1.122:8080 max_fails=1 fail_timeout=10s;
}
--------------指令參數(shù)解釋----------------
max_fails=number 設(shè)定Nginx與服務(wù)器通信的嘗試失敗的次數(shù)。在fail_timeout參數(shù)定義的時間段內(nèi),如果失敗的次數(shù)達(dá)到此值,Nginx就認(rèn)為服務(wù)器不可用。在下一個fail_timeout時間段,服務(wù)器不會再被嘗試。
失敗的嘗試次數(shù)默認(rèn)是1。設(shè)為0就會停止統(tǒng)計嘗試次數(shù),即不對后端節(jié)點(diǎn)進(jìn)行健康檢查。認(rèn)為服務(wù)器是一直可用的。
fail_timeout=time 設(shè)定服務(wù)器被認(rèn)為不可用的時間段以及統(tǒng)計失敗嘗試次數(shù)的時間段。在這段時間中,服務(wù)器失敗次數(shù)達(dá)到指定的嘗試次數(shù),服務(wù)器就被認(rèn)為不可用。
默認(rèn)情況下,該超時時間是10秒。
在實(shí)際應(yīng)用當(dāng)中:
1)如果后端應(yīng)用是能夠快速重啟的應(yīng)用,比如nginx的話,自帶的模塊是可以滿足需求的。
但是需要注意,如果后端有不健康節(jié)點(diǎn),負(fù)載均衡器依然會先把該請求轉(zhuǎn)發(fā)給該不健康節(jié)點(diǎn),然后再轉(zhuǎn)發(fā)給別的節(jié)點(diǎn),這樣就會浪費(fèi)一次轉(zhuǎn)發(fā)。
2)如果當(dāng)后端應(yīng)用重啟時,重啟操作需要很久才能完成的時候就會有可能拖死整個負(fù)載均衡器。
此時,由于無法準(zhǔn)確判斷節(jié)點(diǎn)健康狀態(tài),導(dǎo)致請求handle住,出現(xiàn)假死狀態(tài),最終整個負(fù)載均衡器上的所有節(jié)點(diǎn)都無法正常響應(yīng)請求。
比如公司的業(yè)務(wù)程序是java開發(fā)的,因此后端主要是nginx集群和tomcat集群。由于tomcat重啟應(yīng)部署上面的業(yè)務(wù)不同,有些業(yè)務(wù)啟動初始化時間過長,就會導(dǎo)致上述現(xiàn)象的發(fā)生,因此不是很建議使用該模式。
并且ngx_http_upstream_module模塊中的server指令中的max_fails參數(shù)設(shè)置值,也會和ngx_http_proxy_module 模塊中的的proxy_next_upstream指令設(shè)置起沖突。
如果將max_fails設(shè)置為0,則代表不對后端服務(wù)器進(jìn)行健康檢查,這樣還會使fail_timeout參數(shù)失效(即不起作用)。
此時判斷后端服務(wù)器情況的唯一依據(jù)便是ngx_http_proxy_module模塊中的proxy_connect_timeout指令和proxy_read_timeout指令,通過將它們的值調(diào)低來發(fā)現(xiàn)不健康節(jié)點(diǎn),進(jìn)而將請求往健康節(jié)點(diǎn)轉(zhuǎn)移。
如果這兩個參數(shù)設(shè)置得過小,但后端程序的執(zhí)行或多或少會超過這個時間的話,這種情況nginx的效率是非常低的。
二、利用nginx_upstream_check_module模塊對后端節(jié)點(diǎn)做健康檢查
除了上面介紹的nginx自帶模塊,還有一個更專業(yè)的模塊,來專門提供負(fù)載均衡器內(nèi)節(jié)點(diǎn)的健康檢查的。這個就是淘寶技術(shù)團(tuán)隊開發(fā)的nginx模塊。
用nginx做前端反向代理,如果后端服務(wù)器宕掉的話,nginx是不會把這臺realserver踢出upstream的,還會把請求轉(zhuǎn)發(fā)到后端的這臺realserver上面。所以當(dāng)某臺機(jī)器出現(xiàn)問題時,會看到nginx的日志會有一段轉(zhuǎn)發(fā)失敗然后轉(zhuǎn)發(fā)正常的日志。借助淘寶技術(shù)團(tuán)隊開發(fā)的nginx??靚ginx_upstream_check_module來檢測后方realserver的健康狀態(tài),如果后端服務(wù)器不可用,則會將其踢出upstream,所有的請求不轉(zhuǎn)發(fā)到這臺服務(wù)器。當(dāng)期恢復(fù)正常時,將其加入upstream。
nginx_upstream_check_module,通過它可以用來檢測后端realserver的健康狀態(tài)。如果后端realserver不可用,則所以的請求就不會轉(zhuǎn)發(fā)到該節(jié)點(diǎn)上。個人比較推薦使用這種方式來檢查nginx后端節(jié)點(diǎn)的健康狀態(tài)。
在淘寶自己的tengine上是自帶了該模塊的,大家可以訪問淘寶tengine的官網(wǎng)http://tengine.taobao.org來獲取該版本的nginx,
如果沒有使用淘寶的tengine的話,可以通過補(bǔ)丁的方式來添加該模塊到我們自己的nginx中。部署流程如下:
配置完畢后,重啟nginx。然后訪問http://localhost/nstatus這個頁面就可以看到當(dāng)前兩臺realserver實(shí)時的健康狀態(tài)。
溫馨提示:在生產(chǎn)環(huán)境的實(shí)施應(yīng)用中需要注意下面兩點(diǎn)
三、利用ngx_http_healthcheck_module模塊對后端節(jié)點(diǎn)做健康檢查
除了上面兩個模塊,nginx官方在早期的時候還提供了一個ngx_http_healthcheck_module模塊用來進(jìn)行nginx后端節(jié)點(diǎn)的健康檢查。nginx_upstream_check_module模塊就是參照該模塊的設(shè)計理念進(jìn)行開發(fā)的,因此在使用和效果上都大同小異。
但是需要注意的是,ngx_http_healthcheck_module模塊僅僅支持nginx的1.0.0版本,1.1.0版本以后都不支持了!因此,對于目前常見的生產(chǎn)環(huán)境上基本都不會去用這個模塊了~
相關(guān)知識
Nginx被動健康檢查和主動健康檢查
十大創(chuàng)造性環(huán)保理念:生活在垃圾之中
懷孕之前女性要做的健康檢查
孕前檢查,健康檢查……
懷孕之前做哪些檢查
職業(yè)健康檢查包括()。A.上崗前的健康檢查B.在崗期間的健康檢查C.應(yīng)急檢查D.離崗時的健康檢查E.職
檢查身體健康!檢查身體健康
健康檢查
健康檢查項(xiàng)目
健康證檢查項(xiàng)目 健康證檢查項(xiàng)目男性
網(wǎng)址: nginx之健康檢查 http://www.u1s5d6.cn/newsview249586.html
推薦資訊
- 1發(fā)朋友圈對老公徹底失望的心情 12775
- 2BMI體重指數(shù)計算公式是什么 11235
- 3補(bǔ)腎吃什么 補(bǔ)腎最佳食物推薦 11199
- 4性生活姿勢有哪些 盤點(diǎn)夫妻性 10428
- 5BMI正常值范圍一般是多少? 10137
- 6在線基礎(chǔ)代謝率(BMR)計算 9652
- 7一邊做飯一邊躁狂怎么辦 9138
- 8從出汗看健康 出汗透露你的健 9063
- 9早上怎么喝水最健康? 8613
- 10五大原因危害女性健康 如何保 7828