nginx后端节点健康检查
一、nginx健康檢查的三種方式
1、ngx_http_proxy_module 模塊和ngx_http_upstream_module模塊(自帶)官網(wǎng)地址:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream 2、nginx_upstream_check_module模塊官網(wǎng)網(wǎng)址:https://github.com/yaoweibin/nginx_upstream_check_module二、ngx_http_proxy_module 模塊和ngx_http_upstream_module模塊(自帶) ? ??
? 嚴(yán)格來(lái)說,nginx自帶是沒有針對(duì)負(fù)載均衡后端節(jié)點(diǎn)的健康檢查的,但是可以通過默認(rèn)自帶的ngx_http_proxy_module 模塊和ngx_http_upstream_module模塊中的相關(guān)指令來(lái)完成當(dāng)后端節(jié)點(diǎn)出現(xiàn)故障時(shí),自動(dòng)切換到健康節(jié)點(diǎn)來(lái)提供訪問。
?ngx_http_proxy_module 模塊中的 proxy_connect_timeout 指令、proxy_read_timeout指令和proxy_next_upstream指令
設(shè)置與后端服務(wù)器建立連接的超時(shí)時(shí)間。應(yīng)該注意這個(gè)超時(shí)一般不可能大于75秒。 語(yǔ)法: proxy_connect_timeout time; 默認(rèn)值: proxy_connect_timeout 60s; 上下文: http, server, location定義從后端服務(wù)器讀取響應(yīng)的超時(shí)。此超時(shí)是指相鄰兩次讀操作之間的最長(zhǎng)時(shí)間間隔,而不是整個(gè)響應(yīng)傳輸完成的最長(zhǎng)時(shí)間。如果后端服務(wù)器在超時(shí)時(shí)間段內(nèi)沒有傳輸任何數(shù)據(jù),連接將被關(guān)閉。 語(yǔ)法: proxy_read_timeout time; 默認(rèn)值: proxy_read_timeout 60s; 上下文: http, server, location語(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 指定在何種情況下一個(gè)失敗的請(qǐng)求應(yīng)該被發(fā)送到下一臺(tái)后端服務(wù)器:error # 和后端服務(wù)器建立連接時(shí),或者向后端服務(wù)器發(fā)送請(qǐng)求時(shí),或者從后端服務(wù)器接收響應(yīng)頭時(shí),出現(xiàn)錯(cuò)誤 timeout # 和后端服務(wù)器建立連接時(shí),或者向后端服務(wù)器發(fā)送請(qǐng)求時(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 # 停止將請(qǐng)求發(fā)送給下一臺(tái)后端服務(wù)器需要理解一點(diǎn)的是,只有在沒有向客戶端發(fā)送任何數(shù)據(jù)以前,將請(qǐng)求轉(zhuǎn)給下一臺(tái)后端服務(wù)器才是可行的。也就是說,如果在傳輸響應(yīng)到客戶端時(shí)出現(xiàn)錯(cuò)誤或者超時(shí),這類錯(cuò)誤是不可能恢復(fù)的。 http {proxy_next_upstream http_502 http_504 http_404 error timeout invalid_header; }?ngx_http_upstream_module模塊中的server指令
示例: 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; }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ù),認(rèn)為服務(wù)器是一直可用的。 你可以通過指令proxy_next_upstream、fastcgi_next_upstream和 memcached_next_upstream來(lái)配置什么是失敗的嘗試。 默認(rèn)配置時(shí),http_404狀態(tài)不被認(rèn)為是失敗的嘗試。
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)中,如果你后端應(yīng)用是能夠快速重啟的應(yīng)用,比如nginx的話,自帶的模塊是可以滿足需求的。但是需要注意。如果后端有不健康節(jié)點(diǎn),負(fù)載均衡器依然會(huì)先把該請(qǐng)求轉(zhuǎn)發(fā)給該不健康節(jié)點(diǎn),然后再轉(zhuǎn)發(fā)給別的節(jié)點(diǎn),這樣就會(huì)浪費(fèi)一次轉(zhuǎn)發(fā)。
? ?? ? 可是,如果當(dāng)后端應(yīng)用重啟時(shí),重啟操作需要很久才能完成的時(shí)候就會(huì)有可能拖死整個(gè)負(fù)載均衡器。此時(shí),由于無(wú)法準(zhǔn)確判斷節(jié)點(diǎn)健康狀態(tài),導(dǎo)致請(qǐng)求handle住,出現(xiàn)假死狀態(tài),最終整個(gè)負(fù)載均衡器上的所有節(jié)點(diǎn)都無(wú)法正常響應(yīng)請(qǐng)求。由于公司的業(yè)務(wù)程序都是java開發(fā)的,因此后端主要是nginx集群和tomcat集群。由于tomcat重啟應(yīng)部署上面的業(yè)務(wù)不同,有些業(yè)務(wù)啟動(dòng)初始化時(shí)間過長(zhǎng),就會(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,則代表不對(duì)后端服務(wù)器進(jìn)行健康檢查,這樣還會(huì)使fail_timeout參數(shù)失效(即不起作用)。此時(shí),其實(shí)我們可以通過調(diào)節(jié)ngx_http_proxy_module 模塊中的 proxy_connect_timeout 指令、proxy_read_timeout指令,通過將他們的值調(diào)低來(lái)發(fā)現(xiàn)不健康節(jié)點(diǎn),進(jìn)而將請(qǐng)求往健康節(jié)點(diǎn)轉(zhuǎn)移。
? ?? ? 以上就是nginx自帶的兩個(gè)和后端健康檢查相關(guān)的模塊。
二、nginx_upstream_check_module模塊
除了自帶的上述模塊,還有一個(gè)更專業(yè)的模塊,來(lái)專門提供負(fù)載均衡器內(nèi)節(jié)點(diǎn)的健康檢查的。這個(gè)就是淘寶技術(shù)團(tuán)隊(duì)開發(fā)的 nginx 模塊 nginx_upstream_check_module,通過它可以用來(lái)檢測(cè)后端 realserver 的健康狀態(tài)。如果后端 realserver 不可用,則所以的請(qǐng)求就不會(huì)轉(zhuǎn)發(fā)到該節(jié)點(diǎn)上。
在淘寶自己的 tengine 上是自帶了該模塊的,大家可以訪問淘寶tengine的官網(wǎng)來(lái)獲取該版本的nginx,官方地址:http://tengine.taobao.org/。
2.1 安裝方法
? A. 可以為nginx打補(bǔ)丁
? B. 現(xiàn)有的nginx替換成tengine:原nginx編譯參數(shù)不變,只進(jìn)行make操作,然后把編譯成功的(tengine中objs下)nginx命令替換到原有的nginx命令即可。
[root@192-168-7-77 ~]# wget https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master[root@192-168-7-77 ~]# unzip master[root@192-168-7-77 ~]# ll -d nginx_upstream_check_module-masterdrwxr-xr-x 6 root root 4096 Aug 12 22:42 nginx_upstream_check_module-master[root@192-168-7-77 ~]# cd /usr/local/src/nginx-1.10.3 #進(jìn)入nginx源碼目錄 [root@192-168-7-77 nginx-1.10.3]# patch -p1 < ../nginx_upstream_check_module-master/check_1.5.12+.patch #選擇補(bǔ)丁版本[root@192-168-7-77 nginx-1.10.3]# ./configure --prefix=/etc/nginx --with-pcre=../pcre-8.36 --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf \--error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock \--http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module \--with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module \--with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module \--with-http_auth_request_module --with-mail --with-mail_ssl_module --with-file-aio --with-openssl=/usr/local/src/openssl-1.0.2o --with-http_v2_module \--add-module=../nginx_upstream_check_module-master #以上編譯參數(shù)需要和原來(lái)一樣[root@192-168-7-77 nginx-1.10.3]# make #只進(jìn)行make,不要make install[root@192-168-7-77 nginx-1.10.3]# mv /usr/sbin/nginx /usr/sbin/nginx.bak[root@192-168-7-77 nginx-1.10.3]# cp objs1/nginx /usr/sbin/nginx[root@192-168-7-77 nginx-1.10.3]# nginx -t[root@192-168-7-77 nginx-1.10.3]# kill -USR2 `cat /var/run/nginx.pid`?
2.2 在nginx的配置文件中加入如下內(nèi)容:
短連接配置
upstream app {server 192.168.7.71;server 192.168.7.72;# 對(duì)app負(fù)載均衡的條目中的所有節(jié)點(diǎn),每3秒檢測(cè)一次,請(qǐng)求1次成功則標(biāo)記為realserver狀態(tài)為up,如果檢測(cè)3次都失敗,則標(biāo)記realserver為down狀態(tài),超時(shí)時(shí)間3秒check interval=3000 rise=1 fall=3 timeout=3000 type=http;check_http_send "HEAD / HTTP/1.0\r\n\r\n";# 該指令指定HTTP回昨的成功狀態(tài),默認(rèn)為2XX和3XX的狀態(tài)是健康的check_http_expect_alive http_2xx http_3xx; }?
長(zhǎng)連接配置
upstream app {server 192.168.7.71:8080;server 192.168.7.72:8080;#對(duì)app負(fù)載均衡的條目中的所有節(jié)點(diǎn),每3秒檢測(cè)一次,請(qǐng)求1次則標(biāo)記為realserver狀態(tài)為up,如果檢測(cè)3次都失敗,則標(biāo)記realserver為down狀態(tài),超時(shí)時(shí)間3秒check interval=3000 rise=1 fall=3 timeout=3000 type=http;#配置http發(fā)送請(qǐng)求,其默認(rèn)值為1,表示tengine完成1次請(qǐng)求后即關(guān)閉連接check_keepalive_requests 1;#配置http健康檢查包發(fā)送的請(qǐng)求內(nèi)容,在采用GET方法的情況下,請(qǐng)求uri的size不宜過大,確保可以在1個(gè)interval內(nèi)傳輸完成,否則會(huì)被健康檢查模塊視為后端服務(wù)或網(wǎng)絡(luò)異常#其中/status/status.html需要在后端主機(jī)中創(chuàng)建目錄和文件,只要能訪問到就可以,內(nèi)容隨意。check_http_send "GET /status/status.html HTTP/1.1\r\nConnection: close\r\nHost: localhost\r\n\r\n"; #該指令指定HTTP回昨的成功狀態(tài),默認(rèn)為2XX和3XX的狀態(tài)是健康的check_http_expect_alive http_2xx http_3xx; }3.3 安裝tengine過程中的報(bào)錯(cuò),因?yàn)閛penssl的版本過高,替換成openssl-1.0.2o版本后問題消失。
?
參考:http://www.iyunv.com/thread-38535-1-1.html
轉(zhuǎn)載于:https://www.cnblogs.com/cyleon/p/10220538.html
總結(jié)
以上是生活随笔為你收集整理的nginx后端节点健康检查的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 由电脑黑屏问题引发的探讨计算机底层原理
- 下一篇: LFS 8.3 中文翻译版本发布!