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