1、简介说明

        nginx是常用的反向代理和负载均衡服务,具有强大并发能力、稳定性、丰富的功能集、低资源的消耗。

        nginx自身是没有针对后端节点健康检查的,但是可以通过默认自带的ngx_http_proxy_module 模块和ngx_http_upstream_module模块中的相关指令来完成当后端节点出现故障时,自动切换到健康节点来提供访问。

        nginx的健康检查有两种,一种是被动健康检查,也就是nginx自带健康检查模块ngx_http_upstream_module,另一种就是主动健康检查,使用第三方模块nginx_upstream_check_module

nginx被动健康检查的缺点:

  1. nginx只有被访问时,才会发起对后端节点探测。如果本次请求中,节点正好出现故障,nginx依然会将请求转交给故障的节点,然后再转交给健康的节点处理。所以不会影响到这次请求的正常进行。由于多了一次转发,会影响效率。
  2. 无法做到预警。

nginx主动健康检查

  1. 淘宝开发的tengine自带心跳检测模块,若健康检查包类型为http,在开启健康检查功能后,nginx会根据设置的间隔向后端服务器端口发送健康检查包,并根据期望的HTTP状态码来判断服务是否健康。后端节点不可用,则请求不会转发到故障节点。
  2. 故障节点恢复后,请求正常转发

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

        淘宝的 tengine 自带了该模块,官方地址:http://tengine.taobao.org。如果是 nginx,可以通过补丁的方式来添加该模块到 nginx 中(https://github.com/yaoweibin/nginx_upstream_check_module)。

2、安装配置

2.1 下载nginx 和 nginx_upstream_check_module

# cd /usr/local/src
# wget https://nginx.org/download/nginx-1.20.2.tar.gz
# tar zxf nginx-1.20.2.tar.gz
# git clone https://github.com/yaoweibin/nginx_upstream_check_module.git
# ls -l
total 1044
drwxr-xr-x 8 1001 1001     158 Nov 16  2021 nginx-1.20.2
-rw-r--r-- 1 root root 1062124 Nov 16  2021 nginx-1.20.2.tar.gz
drwxr-xr-x 7 root root    4096 Jul 20 23:50 nginx_upstream_check_module

2.2 为nginx打补丁并编译安装

# cd nginx-1.20.2
# patch -p1 < /usr/local/src/nginx_upstream_check_module/check_1.20.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
patching file src/http/ngx_http_upstream_round_robin.h

# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_geoip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-pcre --with-pcre-jit --with-stream_geoip_module --add-module=/usr/local/src/nginx_upstream_check_module
# make && make install

2.3 配置案例及效果

# cat conf/conf.d/nginx_upstream_check.conf
upstream cluster{
    server 192.168.100.210:9091;
    server 192.168.100.210:9092;
    check interval=3000 rise=2 fall=2 timeout=3000 type=http;
    check_http_send "GET /ops/v1/check HTTP/1.0\r\n\r\n ";
    check_http_expect_alive http_2xx http_3xx;
}


server {
    listen       8888;
    server_name  localhost;
    #charset koi8-r;
    access_log  logs/nginx_upstream_check.log  main;

    location / {
        root   html;
        index  index.html;
    }

    location ^~ /nginxServer/ {
        proxy_pass http://cluster/;
        proxy_set_header Host qyapi.weixin.qq.com;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass_request_body on;
        proxy_set_header   Cookie $http_cookie;
        real_ip_header X-Real-IP;
    }

    location /nginx_status {
        check_status;
        access_log off;
    }
}

2.4 语法及指令介绍

check interval=milliseconds [fall=count] [rise=count] [timeout=milliseconds] [default_down=true|false] [type=tcp|http|ssl_hello|mysql|ajp] [port=check_port]
  1. interval: 向后端发送的健康检查包的间隔,单位为毫秒
  2. rise: 如果连续成功次数达到rise_count,服务器就被认为是up
  3. fall: 如果连续失败次数达到fall_count,服务器就被认为是down
  4. timeout: 后端健康请求的超时时间,单位为毫秒
  5. type: 健康检查包的类型,支持类型如下:
    1. tcp:简单的tcp连接,如果连接成功,就说明后端正常
    2. ssl_hello:发送一个初始的SSL hello包并接受服务器的SSL hello包
    3. http:发送HTTP请求,通过后端的回复包的状态来判断后端是否存活
    4. mysql: 向mysql服务器连接,通过接收服务器的greeting包来判断后端是否存活
    5. ajp:向后端发送AJP协议的Cping包,通过接收Cpong包来判断后端是否存活
  6. default_down: 设定初始时服务器的状态,如果是true,就说明默认是down的,如果是false,就是up的。默认值是true,也就是一开始服务器认为是不可用,要等健康检查包达到一定成功次数以后才会被认为是健康的
  7. port: 指定后端服务器的检查端口。你可以指定不同于真实服务的后端服务器的端口,比如后端提供的是443端口的应用,你可以去检查80端口的状态来判断后端健康状况。默认是0,表示跟后端server提供真实服务的端口一样

2.5 check_http_send功能

用法:check_http_send "GET / HTTP/1.0\r\n\r\n"
默认值: "GET / HTTP/1.0\r\n\r\n"
位置:upstream块
说明:http://ip:port/做健康检测

2.6 监控

    You can specify the default display format. The formats can be `html`,
    `csv` or `json`. The default type is `html`. It also supports to specify
    the format by the request argument. Suppose your `check_status` location
    is '/status', the argument of `format` can change the display page's
    format. You can do like this:

        /status?format=html
        /status?format=csv
        /status?format=json

    At present, you can fetch the list of servers with the same status by
    the argument of `status`. For example:

        /status?format=html&status=down
        /status?format=csv&status=up

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部