首頁 資訊 nginx之健康檢查

nginx之健康檢查

來源:泰然健康網(wǎng) 時(shí)間:2024年12月04日 01:22

正常情況下,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

推薦資訊