Nginx HTTP health_check

什么是health_check

health_check是用于向每个成员发送相同请求的预定规则。health_check向负载均衡器组的每个成员发送请求,以建立每个成员服务器的可用性以接受客户端请求。对于某些类型的health_check,计算来自服务器的响应以确定每个成员服务器的健康状态。成功完成health_check需要服务器通过正常的 TCP 和 HTTP 连接标准。

在TCP模式下,通过TCP连接请求进行health_check。而在标准health_check类型HTTP模式下,health_check是通过HTTP GET或HTTP POST方法进行的。

HTTP health_check

Nginx Plus 和 Nginx 开源可以不断测试我们的上游服务器,避免出现故障的服务器,并将恢复的服务器优雅地添加到负载均衡组中。

被动health_check

对于被动health_check,Nginx Plus 和 Nginx 会在事务发生时对其进行监控,并尝试恢复失败的连接。如果事务仍然无法恢复,Nginx Plus 和 Nginx 开源将服务器标记为不可用并暂时停止向其发送请求,直到它再次标记为活动。

上游服务器被标记的条件使用 upstream 块中的 server 指令的参数为每个上游服务器定义不可用。

示例:

在下面的示例中,如果 Nginx 无法向服务器发送请求或者如果 3 次没有收到响应在 30 秒后,它会将服务器标记为 30 秒不可用:

upstream backend {
    server backend1.example.com;
    server backend2.example.com max_fails=3 fail_timeout=30s;
}

主动health_check

Nginx Plus 通过向每个服务器发送特殊的health_check请求并验证正确响应来定期检查上游服务器的健康状况。

启用主动health_check:

1) 将请求传递给上游组的位置,包括 health_check 指令:

server {
  location / {
        proxy_pass http://backend;
        health_check;
    }
}

2) 在上游服务器组中,使用 zone 指令指定共享内存区域:

http {
    upstream backend {
        zone backend 64k;
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
        server backend4.example.com;
    }
}

我们可以使用 health_check 指令的参数覆盖主动health_check的默认值:

location / {
    proxy_pass http://backend;
    health_check interval=10 fails=3 passes=2;
}

指定请求的URI

我们可以使用health_check指令的uri参数来设置在health_check中请求的URI:

location / {
    proxy_pass http://backend;
    health_check uri=/some/path;
}

指定的URI(Uniform Resource Identifier)附加到上游块中为服务器设置的服务器域名或IP地址。在上面的示例中,对于示例后端组中的第一个服务器,health_check请求 URI http://backend1.example.com/some/path.

定义自定义条件

我们可以指定响应的自定义条件必须满足服务器通过health_check。条件在 match 块中定义,在 health_check 指令的 match 参数中引用:

1) 在 http { } 级别,定义 match {} 块并为其命名,例如,server_ok:

http {
    #...
    match server_ok {
        # tests are here
    }
}

2) 通过定义匹配参数和匹配块的名称来引用 health_check 指令中的块:

http {
    #...
    match server_ok {
        status 200-399;
        body !~ "maintenance mode";
    }
    server {
        #...
        location / {
            proxy_pass http://backend;
            health_check match=server_ok;
        }
    }
}

在上面的例子中,如果响应的状态码在200-399范围内,并且其主体不包含字符串维护模式,则health_check通过。

压缩过程减少了传输数据的大小。然而,由于压缩发生在运行时,它也可能包括相当大的处理开销,这会对性能产生负面影响。 Nginx 在向客户端发送响应之前执行压缩,但不会对已经压缩的响应进行双重压缩。启用压缩要启用压缩,请 ...