nginx后端节点健康状态检查
nginx后端节点健康状态检查
在nginx做负载均衡时,不可避免的遇到后端节点宕机的情况,本文从两个方面介绍nginx如何处理这种情况。
- 被动处理-宕机时转发请求
- 主动处理-后端节点健康状态检查
1. 被动处理-宕机时转发请求
nginx服务器给2台web服务器做代理,负载均衡算法采用轮询,那么当一台web服务器异常关闭不能访问,那么nginx服务器分发请求还是会给这台不能访问的web服务器,如果这里的响应连接时间过长,就会导致客户端的页面一直在等待响应。
默认不进行配置的情况下,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。
参考资料
- nginx做负载均衡,怎么在有宕机情况出现时保证网站的响应速度,http://blog.csdn.net/wwhrestarting/article/details/50807715
- Nginx后端节点健康检查,http://blog.csdn.net/leining_chris/article/details/50016019
- yaoweibin/nginx_upstream_check_module,https://github.com/yaoweibin/nginx_upstream_check_module
- centos 使用yum安装nginx后如何添加模块 ,https://zhidao.baidu.com/question/581069144.html