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實例: