23、nginx動態添加nginx_upstream_check_module健康檢查模塊


nginx_upstream_check_module模塊地址:https://github.com/yaoweibin/nginx_upstream_check_module

23.1、說明:

1、nginx自帶的針對后端節點健康檢查的功能比較簡單,通過默認自帶的ngx_http_proxy_module模塊和ngx_http_upstream_module

模塊中的相關指令來完成當后端節點出現故障時,自動切換到健康節點來提供訪問。


2、示例:

upstream pools {

server 192.168.3.101:80 weight=1 max_fails=3 fail_timeout=3s;

}


參數說明:

(1)max_fails=<number>:

設定Nginx與服務器通信的嘗試失敗的次數。在fail_timeout參數定義的時間段內,如果失敗的次數達到此值,Nginx就認為服務器不可用。

在下一個fail_timeout時間段,服務器不會再被嘗試。失敗的嘗試次數默認是1。設為0就會停止統計嘗試次數,認為服務器是一直可用的。

可以通過指令proxy_next_upstream、fastcgi_next_upstream、memcached_next_upstream來配置什么是失敗的嘗試。默認配置時,

http_404狀態不被認為是失敗的嘗試。


(2)fail_timeout=<time>:

設定服務器被認為不可用的時間段以及統計失敗嘗試次數的時間段。在這段時間中,服務器失敗次數達到指定的嘗試次數,服務器就被認為

不可用。默認情況下,該超時時間是10秒。


3、小結:

以上可以得出Nginx無法主動識別后端節點狀態,后端即使有不健康節點,負載均衡器依然會先把該請求轉發給該不健康節點,然后再轉發

給別的節點,這樣就會浪費一次轉發,而且自帶模塊無法做到預警。因此需要使用第三方模塊nginx_upstream_check_module。

nginx_upstream_check_module模塊由淘寶團隊開發,淘寶自己的tengine上是自帶了該模塊的,可以訪問淘寶http://tengine.taobao.org/

官網來獲取該版本的nginx。我使用的是原生Nginx,采用添加模塊的方式。


23.2、添加模塊流程:

1、下載第三方擴展模塊nginx_upstream_check_module:

[root@slave-node1 ~]# cd /tools/

[root@slave-node1 tools]# wget https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master

[root@slave-node1 tools]# unzip master 1>/dev/null

[root@slave-node1 tools]# ls -ld nginx_upstream_check_module-master


2、查看nginx編譯安裝時安裝了哪些模塊:

[root@slave-node1 tools]# /application/nginx/sbin/nginx -V

nginx version: nginx/1.16.0

built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)

built with OpenSSL 1.0.2k-fips 26 Jan 2017

TLS SNI support enabled

configure arguments: --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --prefix=/application/nginx-1.16.0


3、重新編譯nginx,加入需要安裝的模塊:

(1)進入到nginx之前源碼編譯安裝的目錄(如果之前源碼編譯的目錄被清除,可以重新解壓一個源碼包即可):

[root@slave-node1 tools]# cd nginx-1.16.0/


(2)為nginx打補丁:

[root@slave-node1 nginx-1.16.0]# patch -p0 < /tools/nginx_upstream_check_module-master/check_1.11.5+.patch

#check版本對nginx的版本有要求,1.12以上版本的nginx補丁為check_1.11.5+.patch。-p0:當前路徑,-p1:上一級路徑。


(3)添加模塊(--add-module=/tools/nginx_upstream_check_module-master):

[root@slave-node1 nginx-1.16.0]# ./configure --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --prefix=/application/nginx-1.16.0 --add-module=/tools/nginx_upstream_check_module-master

[root@slave-node1 nginx-1.16.0]# make

#注意:make后千萬不要make install,因為只是編譯,不安裝,否則會覆蓋掉線上的配置。


(4)檢查模塊是否被添加成功:

[root@slave-node1 nginx-1.16.0]# objs/nginx -V

注意:以后該模塊目錄是不能刪除的,否則會因為找不到模塊目錄會出錯。


4、替換線上nginx二進制文件:

(1)停止nginx服務:

[root@slave-node1 nginx-1.16.0]# cd ~

[root@slave-node1 ~]# /application/nginx/sbin/nginx -s stop


(2)備份線上nginx二進制文件:

[root@slave-node1 ~]# mv /application/nginx/sbin/nginx{,.bak}


(3)復制:

[root@slave-node1 ~]# cp -a /tools/nginx-1.16.0/objs/nginx /application/nginx/sbin/


(4)再次驗證模塊是否添加成功:

[root@slave-node1 ~]# /application/nginx/sbin/nginx -V

#至此,nginx的nginx_upstream_check_module健康檢查模動態安裝安裝完成。


23.3、修改upstream反向代理池,讓nginx_upstream_check_module模塊生效:

這里以tomcat8080/8081實例負載均衡為例。

1、啟動tomcat8080/8081實例:

[root@slave-node1 ~]# for n in {0..1};do su - tomcat /application/tomcat-808$n/bin/startup.sh;sleep 10s;done


2、創建 tomcat-upstream.conf 文件:

[root@slave-node1 ~]# vim /application/nginx/conf/conf.d/tomcat-upstream.conf

upstream tomcat_pools {

ip_hash;

server 172.16.1.91:8080 weight=1 max_fails=3 fail_timeout=3s;

server 172.16.1.91:8081 weight=1 max_fails=3 fail_timeout=3s;

check interval=2000 rise=3 fall=2 timeout=1000 type=http;

#對tomcat_pools這個負載均衡池中的所有節點,每個2秒檢測一次,

#請求3次正常則標記realserver狀態為up,如果檢測2次都失敗,則

#標記realserver的狀態為down,后端健康請求的超時時間為1s,健

#康檢查包的類型為http請求。

check_http_send "HEAD / HTTP/1.0\r\n\r\n";

#通過http HEAD消息頭檢測realserver的健康

check_http_expect_alive http_2xx http_3xx;

#該指令指定HTTP回復的成功狀態,默認為2XX和3XX的狀態是健康的

}


server {

listen 0.0.0.0:80;

server_name localhost;

access_log logs/tomcat-access.log main;

error_log logs/tomcat-error.log warn;


location / {

proxy_pass http://tomcat_pools;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}


location /nstatus {

#狀態頁配置

check_status;

access_log off;

allow 172.16.1.254;

#允許可以連接的遠端ip地址

deny all;

#限制所有遠端ip的連接

}

}


健康檢查參數說明:

interval:向后端發送的健康檢查包的間隔。

fall(fall_count):如果連續失敗次數達到fall_count,服務器就被認為是down。

rise(rise_count):如果連續成功次數達到rise_count,服務器就被認為是up。

timeout:后端健康請求的超時時間。

default_down:設定初始時服務器的狀態,如果是true,就說明默認是down的,如果是false,就是up的。

默認值是true,也就是一開始服務器認為是不可用,要等健康檢查包達到一定成功次數以后才會被認為是健康的。

type:健康檢查包的類型,現在支持以下多種類型:

tcp:簡單的tcp連接,如果連接成功,就說明后端正常。

ssl_hello:發送一個初始的SSL hello包並接受服務器的SSL hello包。

http:發送HTTP請求,通過后端的回復包的狀態來判斷后端是否存活。

mysql:向mysql服務器連接,通過接收服務器的greeting包來判斷后端是否存活。

ajp:向后端發送AJP協議的Cping包,通過接收Cpong包來判斷后端是否存活。

port:指定后端服務器的檢查端口。你可以指定不同於真實服務的后端服務器的端口,比如后端提供的是443端

口的應用,你可以去檢查80端口的狀態來判斷后端健康狀況。默認是0,表示跟后端server提供真實服務的端口一

樣。該選項出現於Tengine-1.4.0。


3、檢測nginx配置文件:

[root@slave-node1 ~]# /application/nginx/sbin/nginx -t


4、啟動nginx負載均衡:

[root@slave-node1 ~]# /application/nginx/sbin/nginx


5、訪問網站:


6、通過web界面查看負載均衡下realserver的健康狀態:

(1)訪問http://172.16.1.91/nstatus監控界面:


(2)down掉tomcat8080實例:
















免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM