Nginx實戰(zhàn)|Nginx健康檢查
? 開源Linux
長按二維碼加關(guān)注~

上一篇:盤點提高國內(nèi)訪問Github的速度的9種方案
服務(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.0\r\n\r\n,返回狀態(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.0\r\n\r\n"?;
下面針對每個配置參數(shù),進(jìn)行詳細(xì)介紹。
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ù)達(dá)到fall_count,服務(wù)器就被認(rèn)為是down。
rise(rise_count): 如果連續(xù)成功次數(shù)達(dá)到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)為是不可用,要等健康檢查包達(dá)到一定成功次數(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)采用長連接進(jìn)行健康檢查時,需在該指令中添加keep-alive請求頭,如:”HEAD / HTTP/1.1\r\nConnection: keep-alive\r\n\r\n”。同時,在采用”GET”方法的情況下,請求uri的size不宜過大,確??梢栽?個interval內(nèi)傳輸完成,否則會被健康檢查模塊視為后端服務(wù)器或網(wǎng)絡(luò)異常。
Syntax:?check_http_send?http_packet
Default:?"GET?/?HTTP/1.0\r\n\r\n"
完整示例
完整示例,如下:
http?{
????upstream?cluster1?{
????????#?simple?round-robin
????????server?192.168.0.1:80;
????????server?192.168.0.2:80;
????????check?interval=3000?rise=2?fall=5?timeout=1000?type=http;
????????check_http_send?"HEAD?/?HTTP/1.0\r\n\r\n";
????????check_http_expect_alive?http_2xx?http_3xx;
????}
????upstream?cluster2?{
????????#?simple?round-robin
????????server?192.168.0.3:80;
????????server?192.168.0.4:80;
????????check?interval=3000?rise=2?fall=5?timeout=1000?type=http;
????????check_keepalive_requests?100;
????????check_http_send?"HEAD?/?HTTP/1.1\r\nConnection:?keep-alive\r\n\r\n";
????????check_http_expect_alive?http_2xx?http_3xx;
????}
????server?{
????????listen?80;
????????location?/1?{
????????????proxy_pass?http://cluster1;
????????}
????????location?/2?{
????????????proxy_pass?http://cluster2;
????????}
????????location?/status?{
????????????check_status;
????????????access_log???off;
????????????allow?SOME.IP.ADD.RESS;
????????????deny?all;
????????}
????}
}
來源:https://ningg.top/nginx-series-health-check/
- End - 關(guān)注「開源Linux」加星標(biāo),提升IT技能
