nginx后端节点健康状态检查

nginx后端节点健康状态检查

在nginx做负载均衡时,不可避免的遇到后端节点宕机的情况,本文从两个方面介绍nginx如何处理这种情况。

  1. 被动处理-宕机时转发请求
  2. 主动处理-后端节点健康状态检查

1. 被动处理-宕机时转发请求

nginx服务器给2台web服务器做代理,负载均衡算法采用轮询,那么当一台web服务器异常关闭不能访问,那么nginx服务器分发请求还是会给这台不能访问的web服务器,如果这里的响应连接时间过长,就会导致客户端的页面一直在等待响应。

web服务器宕机情况图示 9vHyCR.png

默认不进行配置的情况下,proxy_connect_timeout时间为60s,即web1服务器出现故障后没有响应,Nginx服务器会在60s后将请求转发给web2服务器。因为默认时间过长,基本上都会存在无法访问,用户无法忍受而主动关闭的情况。

可以在niginx.conf配置里,server配置里增加proxy_connect_timeout、proxy_read_timeout、proxy_send_timeout的属性均设置为1,可以简单的解决无法转发访问请求的问题。

server {  
    listen 80;  
    #server_name  localhost;  
    proxy_connect_timeout 1;  
    proxy_read_timeout 1;  
    proxy_send_timeout 1;  
    }  

在实际应用当中,如果你后端应用是能够快速重启的应用,比如nginx的话,自带的模块是可以满足需求的。但是需要注意。如果后端有不健康节点,负载均衡器依然会先把该请求转发给该不健康节点,然后再转发给别的节点,这样就会浪费一次转发。

可是,如果当后端应用重启时,重启操作需要很久才能完成的时候就会有可能拖死整个负载均衡器。此时,由于无法准确判断节点健康状态,导致请求handle住,出现假死状态,最终整个负载均衡器上的所有节点都无法正常响应请求。

但是因为配置较为简单,逻辑上也比较清晰,实际上也有一定的使用场景。

2. 主动处理-后端节点健康状态检查

除了第上面讲到的使用自带的配置来进行处理宕机的,还有来专门提供负载均衡器内节点的健康检查的模块。这个就是淘宝技术团队开发的 nginx 模块 nginx_upstream_check_module,通过它可以用来检测后端 realserver 的健康状态。如果后端 realserver 不可用,则所以的请求就不会转发到该节点上。

我们可以通过安装补丁将nginx_upstream_check_module模块部署到现在的nginx(介绍的是yum安装的nginx,编译安装的nginx也类似)上。下面是部署流程:

2.1 确认你已经yum安装的nginx信息

nginx -V

nginx version: nginx/1.12.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_auth_request_module --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-http_perl_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-google_perftools_module --with-debug --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E'

2.2 官网下载和此版本相同的nginx源码包并解压

wget http://nginx.org/download/nginx-1.12.2.tar.gz
tar -xvzf nginx-1.12.2.tar.gz

2.3 安装相关依赖

yum -y install gcc pcre-devel openssl-devel libxslt-devel libxml2 gd-devel geoip-devel google-perftools google-perftools-devel

2.4 下载 nginx_upstream_check_module模块

wget https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master

unzip master

2.5 为nginx打补丁

#进入解压的nginx-1.12.2目录
cd nginx-1.12.2

patch -p1< ../nginx_upstream_check_module-master/check_1.12.1+.patch
#不同版本.patch不同

#编译./configure 后面加上 第1步nginx -V查看到的所有配置参数,后面加上你要加的模块配置
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx ...(太长我省略了) --add-module=../nginx_upstream_check_module-master/

make
#千万别make install 

./objs/nginx -t
#验证新nginx是否可用验证编译后的nginx是否可以使用已有的配置

#停掉nginx服务
service nginx stop

#使用新nginx
#备份 
cp /usr/sbin/nginx /usr/sbin/nginx-bak
#替换 
cp ./objs/nginx /usr/sbin/nginx
 
#重启nginx 
service nginx start

2.6 在nginx.conf配置文件里面的upstream加入健康检查

upstream  www.mydomain.com {
         server 192.168.2.3 ; #server1
         server 192.168.2.4 ; #server2
         check interval=3000 rise=2 fall=5 timeout=1000 type=http;      
}

上面配置的意思是,对name这个负载均衡条目中的所有节点,每个3秒检测一次,请求2次正常则标记 realserver状态为up,如果检测 5 次都失败,则标记 realserver的状态为down,超时时间为1秒。

延伸阅读:nginx_upstream_check_module模块的原理及各个参数的详细含义,见参考资料2/3。

参考资料

  1. nginx做负载均衡,怎么在有宕机情况出现时保证网站的响应速度,http://blog.csdn.net/wwhrestarting/article/details/50807715
  2. Nginx后端节点健康检查,http://blog.csdn.net/leining_chris/article/details/50016019
  3. yaoweibin/nginx_upstream_check_module,https://github.com/yaoweibin/nginx_upstream_check_module
  4. centos 使用yum安装nginx后如何添加模块 ,https://zhidao.baidu.com/question/581069144.html

如有疑问,欢迎交流

Table of Contents