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















猜你喜欢

转载自www.cnblogs.com/LiuChang-blog/p/12501226.html