Nginx实现后端节点健康检查功能

目前,作为代理服务器nginx对后端节点健康检查的方式主要有3种,这里列出:

1,ngx_http_proxy_module 模块和ngx_http_upstream_module模块(nginx自带,问题很多,生存环境使用的情况很少)
官网地址:http://nginx.org/cn/docs/http/ngx_http_proxy_module.html#proxy_next_upstream

2,nginx_upstream_check_module模块 (淘宝团队开发,目前使用的最多的方式)
官网网址:https://github.com/yaoweibin/nginx_upstream_check_module

3,直接使用淘宝tengine,作为代理服务器,官方地址:http://tengine.taobao.org/

 

今天,我重点介绍第2种方法及如何实现

nginx_upstream_check_module模块

这是一个更专业的模块,来专门提供负载均衡器内节点的健康检查的。这个就是淘宝技术团队开发的 nginx 模块 nginx_upstream_check_module,通过它可以用来检测后端 realserver 的健康状态。如果后端 realserver 不可用,则所以的请求就不会转发到该节点上。

在淘宝自己的 tengine 上是自带了该模块的,大家可以访问淘宝tengine的官网来获取该版本的nginx,官方地址:http://tengine.taobao.org/ 。

如果我们没有使用淘宝的 tengine 的话,可以通过补丁的方式来添加该模块到我们自己的 nginx 中。我们业务线上就是采用该方式进行添加的。

具体实现步骤:

1、下载 nginx_upstream_check_module模块
wget https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master
unzip master

[root@docker02 ~]# ll nginx_upstream_check_module-master/
total 268
-rw-r–r– 1 root root 0 Nov 3 2019 CHANGES
-rw-r–r– 1 root root 7921 Nov 3 2019 check_1.11.1+.patch
-rw-r–r– 1 root root 8330 Nov 3 2019 check_1.11.5+.patch
-rw-r–r– 1 root root 8060 Nov 3 2019 check_1.12.1+.patch
-rw-r–r– 1 root root 8054 Nov 3 2019 check_1.14.0+.patch
-rw-r–r– 1 root root 8409 Nov 3 2019 check_1.16.1+.patch
-rw-r–r– 1 root root 5483 Nov 3 2019 check_1.2.1.patch
-rw-r–r– 1 root root 7130 Nov 3 2019 check_1.2.2+.patch
-rw-r–r– 1 root root 7094 Nov 3 2019 check_1.2.6+.patch
-rw-r–r– 1 root root 6791 Nov 3 2019 check_1.5.12+.patch
-rw-r–r– 1 root root 8295 Nov 3 2019 check_1.7.2+.patch
-rw-r–r– 1 root root 8346 Nov 3 2019 check_1.7.5+.patch
-rw-r–r– 1 root root 8509 Nov 3 2019 check_1.9.2+.patch
-rw-r–r– 1 root root 6943 Nov 3 2019 check.patch
-rw-r–r– 1 root root 749 Nov 3 2019 config
drwxr-xr-x 2 root root 43 Nov 3 2019 doc
-rw-r–r– 1 root root 1709 Nov 3 2019 nginx-sticky-module.patch
drwxr-xr-x 2 root root 29 Nov 3 2019 nginx-tests
-rw-r–r– 1 root root 112085 Nov 3 2019 ngx_http_upstream_check_module.c
-rw-r–r– 1 root root 529 Nov 3 2019 ngx_http_upstream_check_module.h
-rw-r–r– 1 root root 2848 Nov 3 2019 ngx_http_upstream_jvm_route_module.patch
-rw-r–r– 1 root root 11509 Nov 3 2019 README
drwxr-xr-x 6 root root 79 Nov 3 2019 test
-rw-r–r– 1 root root 3342 Nov 3 2019 upstream_fair.patch
drwxr-xr-x 2 root root 81 Nov 3 2019 util

2、为nginx打补丁
[root@docker02 ~]# cd nginx-1.19.9
[root@docker02 nginx-1.19.9]# patch -p1 < ../nginx_upstream_check_module-master/check_1.16.1+.patch
patching file src/http/modules/ngx_http_upstream_hash_module.c
patching file src/http/modules/ngx_http_upstream_ip_hash_module.c
patching file src/http/modules/ngx_http_upstream_least_conn_module.c
patching file src/http/ngx_http_upstream_round_robin.c
Hunk #1 succeeded at 9 with fuzz 2.
Hunk #2 succeeded at 107 (offset 6 lines).
Hunk #3 succeeded at 186 (offset 12 lines).
Hunk #4 succeeded at 263 (offset 13 lines).
Hunk #5 succeeded at 383 (offset 14 lines).
Hunk #6 succeeded at 420 (offset 14 lines).
Hunk #7 succeeded at 488 (offset 14 lines).
Hunk #8 succeeded at 588 (offset 14 lines).
patching file src/http/ngx_http_upstream_round_robin.h

3、安装nginx
./configure \
--prefix=/application/nginx-1.19.9 \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_gzip_static_module \
--with-http_realip_module \
--with-http_geoip_module \
--with-threads \
--with-stream \
--add-module=/root/nginx_upstream_check_module-master \
--with-http_stub_status_module

3、部署环境

准备3台realserves

[root@docker02 conf]# cat vhost/real_server_8*
server {
listen 81;
server_name www.123.com 123.com;
location / {
root /home/81;
index index.html index.htm;
#stub_status on;
#access_log /root/logs/access.123.com.log commonlog;
}
}

server {
listen 82;
server_name www.123.com 123.com;
location / {
root /home/82;
index index.html index.htm;
#stub_status on;
#access_log /root/logs/access.123.com.log commonlog;
}
}

server {
listen 83;
server_name www.123.com 123.com;
location / {
root /home/83;
index index.html index.htm;
#stub_status on;
#access_log /root/logs/access.123.com.log commonlog;
}
}

 

4、配置反向代理和负载均衡,一般在nginx.conf中配置

upstream real_servers {
server 192.168.0.62:81;
server 192.168.0.62:82;
server 192.168.0.62:83;
check interval=3000 rise=2 fall=5 timeout=1000 type=http;

}

参数解释 
1.  #添加了nginx_upstream_check_module模块之后,该项生效  
2.  #用于检测后方realserver的健康状态,如果后端服务器不可用,则请求不转发到这台服务器。  
3.  #interval:每隔3s检测一次  
4.  #rise:检测次数,如果连续检测2次都成功,那就证明该后端节点正常
5.  #fall:检测次数,如果连续检测5次都失败,那就证明该后端节点不健康  
6.  #timeout:超时时间为1s 

server {
listen 80;
server_name 123.com;

location /{
proxy_pass http://real_servers;
proxy_set_header Host $host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

location /realserversstatus{
check_status;
access_log off;
}

}

5、测试实际效果

关闭2台realservers

6、补充

以上nginx_upstream_check_module模块的相关信息,更多的信息大家可以去该模块的淘宝tengine页面和github上该项目页面去查看,下面是访问地址:

http://tengine.taobao.org/document_cn/http_upstream_check_cn.html

https://github.com/yaoweibin/nginx_upstream_check_module

Nginx实现后端节点健康检查功能
5 1 vote
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
Scroll to top
0
Would love your thoughts, please comment.x
()
x