服務(wù)治理的一個重要任務(wù)是感知服務(wù)節(jié)點變更,完成服務(wù)自動注冊及異常節(jié)點的自動摘除。這就需要服務(wù)治理平臺能夠:及時、準(zhǔn)確的感知service節(jié)點的健康狀況。
Nginx 提供了三種HTTP服務(wù)健康檢查方案供用戶選擇:
- TCP層默認(rèn)檢查方案:定時與后端服務(wù)建立一條tcp連接,鏈接建立成功則認(rèn)為服務(wù)節(jié)點是健康的。
- HTTP層默認(rèn)檢查方案:TCP層檢查有一定的局限性:
- 很多HTTP服務(wù)是帶狀態(tài)的,端口處于listen狀態(tài)并不能代表服務(wù)已經(jīng)完成預(yù)熱;
- 不能真實反映服務(wù)內(nèi)部處理邏輯是否產(chǎn)生擁堵。
- 這時可以選擇http層健康檢查,會向服務(wù)發(fā)送一個http請求GET / HTTP/1.0rnrn,返回狀態(tài)是2xx或3xx時認(rèn)為后端服務(wù)正常。
- 自定義方案:可根據(jù)下文描述自定義檢查方案。
配置參數(shù)詳解
一個常用的健康檢查配置如下:
check fall=3 interval=3000 rise=2 timeout=2000 type=http;
check_http_expect_alive http_2xx http_3xx ;check_http_send "GET /checkAlive HTTP/1.0rnrn" ;
下面針對每個配置參數(shù),進行詳細介紹。
check:
check 字段參數(shù)如下:
Syntax: check interval=milliseconds [fall=count] [rise=count] [timeout=milliseconds] [default_down=true|false] [type=tcp|http|ssl_hello|MySQL|ajp] [port=check_port]
Default: 如果沒有配置參數(shù),默認(rèn)值是:interval=30000 fall=5 rise=2 timeout=1000 default_down=true type=tcp
check 字段各個參數(shù)含義如下:
- interval:向后端發(fā)送的健康檢查包的間隔。
- fall(fall_count): 如果連續(xù)失敗次數(shù)達到fall_count,服務(wù)器就被認(rèn)為是down。
- rise(rise_count): 如果連續(xù)成功次數(shù)達到rise_count,服務(wù)器就被認(rèn)為是up。
- timeout: 后端健康請求的超時時間。
- default_down: 設(shè)定初始時服務(wù)器的狀態(tài),如果是true,就說明默認(rèn)是down的,如果是false,就是up的。默認(rèn)值是true,也就是一開始服務(wù)器認(rèn)為是不可用,要等健康檢查包達到一定成功次數(shù)以后才會被認(rèn)為是健康的。
- type:健康檢查包的類型,現(xiàn)在支持以下多種類型
- tcp:簡單的tcp連接,如果連接成功,就說明后端正常。
- ssl_hello:發(fā)送一個初始的SSL hello包并接受服務(wù)器的SSL hello包。
- http:發(fā)送HTTP請求,通過后端的回復(fù)包的狀態(tài)來判斷后端是否存活。
- mysql: 向mysql服務(wù)器連接,通過接收服務(wù)器的greeting包來判斷后端是否存活。
- ajp:向后端發(fā)送AJP協(xié)議的Cping包,通過接收Cpong包來判斷后端是否存活。
- port: 指定后端服務(wù)器的檢查端口??梢灾付ú煌谡鎸嵎?wù)的后端服務(wù)器的端口,比如后端提供的是443端口的應(yīng)用,你可以去檢查80端口的狀態(tài)來判斷后端健康狀況。默認(rèn)是0,表示跟后端server提供真實服務(wù)的端口一樣。
check_http_expect_alive:
check_http_expect_alive 指定主動健康檢查時HTTP回復(fù)的成功狀態(tài):
Syntax: check_http_expect_alive [ http_2xx | http_3xx | http_4xx | http_5xx ]
Default: http_2xx | http_3xx
check_http_send:
check_http_send 配置http健康檢查包發(fā)送的請求內(nèi)容
為了減少傳輸數(shù)據(jù)量,推薦采用”HEAD”方法。當(dāng)采用長連接進行健康檢查時,需在該指令中添加keep-alive請求頭,如:”HEAD / HTTP/1.1rnConnection: keep-alivernrn”。同時,在采用”GET”方法的情況下,請求uri的size不宜過大,確保可以在1個interval內(nèi)傳輸完成,否則會被健康檢查模塊視為后端服務(wù)器或網(wǎng)絡(luò)異常。
Syntax: check_http_send http_packet
Default: "GET / HTTP/1.0rnrn"