我们在使用nginx做负载均衡,需要判断后端服务器的可用性,如果不可用,需要提出服务器列表。下面讨论下nginx健康检查的几种方案

1.ngx_http_proxy_module 模块和ngx_http_upstream_module模块

这两个是nginx自带的,我们在前面几篇文章其实分析到过。

1.1 ngx_http_proxy_module 模块

(1) proxy_connect_timeout:设置与后端服务器建立连接的超时时间。默认60秒,作用域:http, server, location。
(2) proxy_read_timeout time:定义从后端服务器读取响应的超时。此超时是指相邻两次读操作之间的最长时间间隔,而不是整个响应传输完成的最长时间。如果后端服务器在超时时间段内没有传输任何数据,连接将被关闭。
默认60秒,作用域:http, server, location。
(3) - proxy_next_upstream:在一台服务器响应失败时,下发至另外一台服务器。语法:proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 |http_404 | off。

error      # 响应出现错误
timeout    # 响应超时
invalid_header  # 响应为空或者非法响应头
http_500   # 响应状态码500
http_502   # 响应状态码502
http_503   # 响应状态码503
http_504   # 响应状态码504
http_404   # 响应状态码404
off        # 停止将请求发送给下一台后端服务器

1.2 ngx_http_upstream_module模块

具体指的是server address [parameters]中的parameters参数。
(1)max_fails
尝试失败的次数。在fail_timeout时间内,如果失败的次数达到此值,Nginx就认为服务器不可用。在下一个fail_timeout时间段,服务器不会再被尝试。 默认次数是1,而且404不被认为是失败。为0就会停止统计尝试次数,认为服务器是一直可用的。
(2)fail_timeout
设定服务器被认为不可用的时间段以及统计失败尝试次数的时间段。在这段时间中,服务器失败次数达到指定的尝试次数,服务器就被认为不可用。默认情况下,该超时时间是10秒。
实例:

upstream test{
                server 192.168.0.1:8080 max_fails=1 fail_timeout=10s;
                server 192.168.0.2:8080max_fails=1 fail_timeout=10s;
        }

这种方式缺点:就算服务器不可用,但请求还是会发到这个节点再转发,又一次多余的路径请求。而且如果应用重新启动时候很慢的话,所有节点都可能判断为不可用。

2. nginx_upstream_check_module

nginx_upstream_check_module是阿里开发的nginx健康检查。和上述不同的一点是如果服务器不可用,请求就不会转发到该节点上。
先看下怎么用,感受下

upstream test{
       server 192.168.0.1:8080;
       server 192.168.0.2:8080;
       check interval=3000 rise=2 fall=5 timeout=1000 type=http;
        
}
interval: 发送的健康检查包的间隔,单位为毫秒
rsie: 如果连续成功次数达到rise_count,服务器就被认为是up
fall: 如果连续失败次数达到fall_count,服务器就被认为是down
timeout: 后端健康请求的超时时间,单位为毫秒
type: 健康检查包的类型,支持tcp、ssl_hello、http、mysql、ajp
port: 指定检查端口。你可以指定不同于真实服务的端口,比如服务器提供的是8080端口的应用,你可以去检查8081端口的状态来判断服务器健康状况。默认是0,表示跟服务器提供真实服务的端口一样。