nginx中的健康檢查方案
ngx_http_proxy_module模塊(自帶) 超時(shí)時(shí)間設(shè)置
無(wú)特別場(chǎng)景需求都可直接采用默認(rèn)60s
- 語(yǔ)法:proxy_connect_timeout ``time``;
- 默認(rèn)值:proxy_connect_timeout 60s;
- 作用域:http, server, location
該指令設(shè)置與upstream server的連接超時(shí)時(shí)間,有必要記住,這個(gè)超時(shí)不能超過(guò)75秒。這個(gè)時(shí)間Nginx與上游服務(wù)器
嘗試建立連接,如果60s內(nèi)都沒(méi)有建立成功,則會(huì)放棄這個(gè)連接。
- 語(yǔ)法:proxy_read_timeout ``time``;
- 默認(rèn)值:proxy_read_timeout 60s;
- 作用域:http, server, location
定義從后端服務(wù)器讀取響應(yīng)的超時(shí)。
此超時(shí)是指相鄰兩次讀操作之間的最長(zhǎng)時(shí)間間隔,而不是整個(gè)響應(yīng)傳輸完成的最長(zhǎng)時(shí)間。
如果后端服務(wù)器在超時(shí)時(shí)間段內(nèi)沒(méi)有傳輸任何數(shù)據(jù),連接將被關(guān)閉(連接成功后_等候后端服務(wù)器響應(yīng)時(shí)間_其實(shí)已經(jīng)進(jìn)入后端的排隊(duì)之中等候處理(也可以說(shuō)是后端服務(wù)器處理請(qǐng)求的時(shí)間))。
- 語(yǔ)法:proxy_send_timeout time;
- 默認(rèn)值:proxy_send_timeout 60s;
- 作用域:http, server, location
設(shè)置將請(qǐng)求傳輸?shù)酱矸?wù)器的超時(shí)。僅在兩個(gè)連續(xù)的寫操作之間設(shè)置超時(shí),而不是為整個(gè)請(qǐng)求的傳輸。
如果代理服務(wù)器在此時(shí)間內(nèi)未收到任何內(nèi)容,則關(guān)閉連接。(后端服務(wù)器數(shù)據(jù)回傳時(shí)間_就是在規(guī)定時(shí)間之內(nèi)后端服務(wù)器必須傳完所有的數(shù)據(jù))。
- 語(yǔ)法: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
后端返回狀態(tài)碼:指定在何種情況下一個(gè)失敗的請(qǐng)求應(yīng)該被發(fā)送到下一臺(tái)后端服務(wù)器
1、nginx 被動(dòng)check 方法
Nginx(自帶)有健康檢查模塊:ngx_http_upstream_module,可以做到基本的健康檢查
參數(shù):
- max_fails:失敗嘗試最大次數(shù);超出此處指定的次數(shù)時(shí),server將被標(biāo)記為不可用,默認(rèn)為1
- fail_timeout:后端服務(wù)器標(biāo)記為不可用狀態(tài)的連接超時(shí)時(shí)長(zhǎng),默認(rèn)10s
- backup:將服務(wù)器標(biāo)記為"備用",即所有服務(wù)器均不可用時(shí)才啟用
例如:
server x.x.x.x:8080 max_fails=3 fail_timeout=30s;` server x.x.x.x:8080 max_fails=3 fail_timeout=30s;`
說(shuō)明:
代表在30秒內(nèi)某一應(yīng)用失敗3次,認(rèn)為該應(yīng)用宕機(jī),后等待30秒,這期間內(nèi)不會(huì)再把新請(qǐng)求發(fā)送到宕機(jī)應(yīng)用,而是直接發(fā)到正常的那一臺(tái),等待的這30秒時(shí)間到后再有請(qǐng)求進(jìn)來(lái)繼續(xù)嘗試連接宕機(jī)應(yīng)用且僅嘗試1次,如果還是失敗,則繼續(xù)等待30秒...以此循環(huán),直到恢復(fù)。`
缺點(diǎn):
Nginx只有當(dāng)有訪問(wèn)時(shí)后,才發(fā)起對(duì)后端節(jié)點(diǎn)探測(cè)。
如果本次請(qǐng)求中,節(jié)點(diǎn)正好出現(xiàn)故障,Nginx依然將請(qǐng)求轉(zhuǎn)交給故障的節(jié)點(diǎn),然后再轉(zhuǎn)交給健康的節(jié)點(diǎn)處理。
所以不會(huì)影響到這次請(qǐng)求的正常進(jìn)行。
但是會(huì)影響效率,因?yàn)槎嗔艘淮无D(zhuǎn)發(fā),而且自帶模塊無(wú)法做到預(yù)警。
2、nginx 主動(dòng)check 方法
nginx_upstream_check_module模塊對(duì)后端節(jié)點(diǎn)做主動(dòng)健康檢查(淘寶開發(fā))
主動(dòng)check:心跳檢測(cè),為非業(yè)務(wù)流量,nginx本身發(fā)起健康檢測(cè)請(qǐng)求。
注意:check模塊版本和Nginx版本要求有限制。做補(bǔ)丁包的時(shí)候注意版本選擇
check指令只能出現(xiàn)在upstream中:
- interval:向后端發(fā)送的健康檢查包的間隔。
- fall:如果連續(xù)失敗次數(shù)達(dá)到fall_count,服務(wù)器就被認(rèn)為是down。
- rise:如果連續(xù)成功次數(shù)達(dá)到rise_count,服務(wù)器就被認(rèn)為是up。
- timeout:后端健康請(qǐng)求的超時(shí)時(shí)間。
- default_down:設(shè)定初始時(shí)服務(wù)器的狀態(tài),如果是true,就說(shuō)明默認(rèn)是down的,如果是false,就是up的。默認(rèn)值是true,也就是一開始服務(wù)器認(rèn)為是不可用,要等健康檢查包達(dá)到一定成功次數(shù)以后才會(huì)被認(rèn)為是健康的
健康檢查包的類型,常用(tcp\http):
- tcp:簡(jiǎn)單的tcp連接,連接成功,就說(shuō)明后端正常(網(wǎng)絡(luò)層探測(cè),通過(guò)發(fā)送SYN握手報(bào)文來(lái)檢測(cè)服務(wù)器端口是否存活)。
- http:發(fā)送HTTP請(qǐng)求,通過(guò)后端的回復(fù)包的狀態(tài)來(lái)判斷后端是否存活
- 不常用:ajp\ssl_hello\mysql\fastcgi
- 說(shuō)明:(將HTTP模式的負(fù)載均衡修改為TCP模式后,負(fù)載均衡將只檢查監(jiān)聽端口狀態(tài),不檢查HTTP狀態(tài),會(huì)導(dǎo)致負(fù)載均衡無(wú)法實(shí)時(shí)獲知HTTP應(yīng)用是否出現(xiàn)問(wèn)題。)
TCP模式配置:
upstream xxxx { server ip:port; server ip:port; check interval=5000 rise=2 fall=3 timeout=1000 type=tcp; }
HTTP模式配置:(需要提供一個(gè)健康檢查的url)
upstream xxxx { server ip:port; server ip:port; check interval=5000 rise=2 fall=3 timeout=1000 type=http; check_http_send "HEAD / HTTP/1.0\r\n\r\n"; #默認(rèn)用HEAD方式 請(qǐng)求缺省頁(yè) check_http_expect_alive http_2xx http_3xx; }
說(shuō)明:
每個(gè)5秒檢測(cè)一次(單位為毫秒),請(qǐng)求2次正常則標(biāo)記 realserver狀態(tài)為up,如果檢測(cè) 3 次都失敗,則標(biāo)記 realserver的狀態(tài)為down,超時(shí)時(shí)間為1秒(單位為毫秒)。
- check_http_send: http 請(qǐng)求方式 如:("GET /index.html HTTP/1.0\r\n\r\n")注意:請(qǐng)求的uri不宜過(guò)大
- check_http_expect_alive: 定義健康的狀態(tài)碼
server 中配置可界面顯示后端健康狀態(tài) location /status { check_status; access_log off; }
3、目前環(huán)境配置建議:為保證業(yè)務(wù)流量無(wú)影響,優(yōu)先采用主動(dòng)check方式
后端應(yīng)用未配置(提供)健康檢查url情況
upstream xxxx { server ip:port; server ip:port; check interval=5000 rise=2 fall=3 timeout=1000 type=tcp; }
后端提供健康檢查url 情況
upstream xxxx { server ip:port; server ip:port; check interval=5000 rise=2 fall=3 timeout=1000 type=http; check_http_send "HEAD /url HTTP/1.0\r\n\r\n"; # /url指提供健康檢查的url check_http_expect_alive http_2xx http_3xx; }
server 中配置。用于界面顯示后端健康狀態(tài) location /status { check_status; access_log off; }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
利用nginx和騰訊云免費(fèi)證書制作https的方法
這篇文章主要介紹了利用nginx和騰訊云免費(fèi)證書制作https的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11nginx配置將HTTPS請(qǐng)求轉(zhuǎn)換成HTTP的方法實(shí)現(xiàn)
Nginx是一個(gè)很流行、很強(qiáng)大的代理軟件,我們可以借助Nginx,設(shè)置 http強(qiáng)轉(zhuǎn)https,本文就來(lái)詳細(xì)的介紹一下,感興趣的可以了解一下2023-09-09nginx結(jié)合keepalived實(shí)現(xiàn)高可用的完整步驟
這篇文章主要給大家介紹了關(guān)于nginx結(jié)合keepalived實(shí)現(xiàn)高可用的完整步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用nginx具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12nginx+lua+redis實(shí)現(xiàn)降級(jí)的示例代碼
隨著用戶訪問(wèn)量的激增,網(wǎng)站或電商平臺(tái)可能會(huì)面臨系統(tǒng)超負(fù)載的問(wèn)題,導(dǎo)致注冊(cè)、下單、支付等功能出現(xiàn)問(wèn)題,為保障核心服務(wù)的高可用性,可以采用降級(jí)策略,本文就來(lái)介紹一下nginx+lua+redis降級(jí),感興趣的可以了解學(xué)習(xí)2024-10-10nginx上部署react項(xiàng)目的實(shí)例方法
今天小編就為大家分享一篇關(guān)于nginx上部署react項(xiàng)目的實(shí)例方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02Nginx設(shè)置Referer來(lái)防止盜圖的實(shí)現(xiàn)方法
這篇文章主要介紹了Nginx設(shè)置Referer來(lái)防止盜圖的實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04