Nginx教程

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通过。
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4