在Nginx负载均衡中,我们很难保证说每一台应用服务器都能一直正常的运行下去。但是我们可以通过设置Nginx来检测这些应用服务器,检测这些服务器当中不能访问的。
Nginx的检测方式分为两种,一种是被动监测,另一种是主动监测。下面我们看看被动监测。
被动监测
当Nginx认为一台应用服务器不能被访问的时候,它会暂时停止向这台应用上面分发请求。直到Nginx认为该应用服务器可以再次被访问的时候才会再向这台应用服务器上面分发请求。要实现对应用服务器的监测,需要通过两个参数来帮助。
max_fails
=number
sets the number of unsuccessful attempts to communicate with the server that should happen in the duration set by the fail_timeout
parameter to consider the server unavailable for a duration also set by the fail_timeout
parameter. By default, the number of unsuccessful attempts is set to 1. The zero value disables the accounting of attempts.
max_fails——设置访问失败的最大次数。当Nginx向一台服务器分发请求,如果失败的次数达到该参数设置的数量,则Nginx认为该应用服务器不能访问。在接下来的请求就不会再发给该应用服务器。直到达到fail_timeout设置的时间才会再次向这台应用分发请求。
fail_timeout
=time
sets
- the time during which the specified number of unsuccessful attempts to communicate with the server should happen to consider the server unavailable;
- and the period of time the server will be considered unavailable.
By default, the parameter is set to 10 seconds.
fail_timeout——该参数表示停止分发请求至该应用服务器的时间。也就是说,如果Nginx认为一台应用服务器不能被访问了,则Nginx就会停止向这台应用服务器上分发请求。那需要多长时间Nginx才会认为该服务器可以被访问从而向其分发请求呢。这就需要通过该参数来设置这个时间了。
使用nginx的好处是它自带有健康检查模块:ngx_http_upstream_module,可以做到基本的健康检查,配置如下:
对于fail_timeout和max_fails的默认值分别为10s和1次。也就是说,当Nginx向一台应用服务器发送请求,如果失败则认为该应用服务器不可访问。接下来的10s中请求不再分发给该应用服务器。直到10s以后会再次将请求分发给该应用服务器。
对于上面示例,我们看到对于8020应用,当请求失败次数达到3次。Nginx会在40s内不再向该应用分发请求。直到40s以后会再次分发新的请求到该应用服务器上。对于8021应用,当请求次数达到2次,Nginx就会在10s内(因为没有设置fail_timeout,所以默认为10s)不再向这台应用发送请求。
这种方式需要我们在每台应用服务器对应的信息后面设置,所以称其为被动监测。
nginx的ngx_http_upstream_module实现了一个基础的健康检查功能。这样有一个缺点是,nginx是被动地进行健康检查,也就是当有请求过来时,且请求打到A服务上时才能得知A服务的状态,如果A服务异常还要转发一次,效率受到影响。所以我们要进行主动地健康检查,nignx定时主动地去ping后端的服务列表,当发现某服务出现异常时,把该服务从健康列表中移除,当发现某服务恢复时,又能够将该服务加回健康列表中。淘宝有一个开源的实现(https://github.com/yaoweibin/nginx_upstream_check_module)