Nginx UDP 健康检查

在这里,我们将讨论如何为负载均衡的上游服务器组中的 UDP(用户数据报协议)服务器配置不同类型的健康检查。

我们已经配置了一组上游服务器来处理流{}上下文中的UDP网络流量(DNS、RADIUS、Syslog),例如:

stream {
    #...
    upstream dns_upstream {
        server 192.168.136.130:53;
        server 192.168.136.131:53;
        server 192.168.136.132:53;
    }
    #...
}

并且我们已经配置了一个将UDP数据报传递给上游服务器组的服务器。

stream {
    #...
    server {
        listen          53 udp;
        proxy_pass      dns_upstream;
        proxy_timeout   1s;
        proxy_responses 1;
        error_log       logs/dns.log;
    }
    #...
}

被动 UDP 健康检查

Nginx Plus 或 Nginx 开源可以将服务器标记为不可用并停止向其发送 UDP 数据报一段时间,如果服务器回复错误或超时。

使用上游服务器的max_fails 参数设置一定时间内连续失败的连接尝试次数。(默认为 1)。

时间是通过 fail_timeout 参数设置的(默认为 10 秒)。该参数还设置了 Nginx 认为服务器不可用的时间量。

因此,如果连接尝试超时或在 10 秒内至少失败一次,Nginx 会标记服务器10 秒内不可用。下面的例子展示了如何在 60 秒内将这些参数设置为两次失败。

upstream dns_upstream {
    server 192.168.136.130:53 fail_timeout=60s;
    server 192.168.136.131:53 fail_timeout=60s;
}

主动 UDP 健康检查

主动健康检查允许检查更广泛的故障类型,并且仅适用于 Nginx Plus。例如,Nginx Plus 会向每个上游服务器发送特殊的健康检查请求,并检查满足特定条件的响应。

如果连接到服务器无法建立,健康检查失败,认为服务器不健康。 Nginx Plus 不会将代理客户端连接到不健康的服务器。如果指定了多个健康检查,则任何检查失败都足以认为相应的上游服务器不健康。

启用主动健康检查:

1.在upstream组中,用zone指令定义一个共享内存区——Nginx Plus工作进程共享计数器和连接状态信息的特殊区域。在区域指令中,指定区域名称和区域大小。(这里,dns_zone 是区域名称,64k 是区域大小)。

stream {
    #...
    upstream dns_upstream {
        zone   dns_zone 64k;
        server 192.168.136.130:53;
        server 192.168.136.131:53;
        server 192.168.136.132:53;
    }
    #...
}

2、在将流量转发到上游组的服务器块中(通过 proxy_pass),将 UDP 参数指定给 health_check 指令。

stream {
    #...
    server {
         listen       53 udp;
         proxy_pass   dns_upstream;
         health_check udp;
    }
    #...
}

基本 udp(用户数据报协议)健康检查假设 Nginx plus 将"Nginx check"字符串发送到上游服务器,并期望没有 icmp"destination unreachable"消息作为响应。

微调 UDP 健康检查

我们可以通过为 health_check 指令指定以下给定参数来微调健康检查:

间隔: 它定义了 Nginx Plus 在几秒钟内发送健康检查请求的频率(默认为 5 秒)。

通过: 多次连续的健康检查,服务器必须响应才能被认为是健康的。默认值为 1、

失败: 一些连续的健康检查,服务器必须无法响应才能被视为不健康。默认值为 1、

server {
    listen       53 udp;
    proxy_pass   dns_upstream;
    health_check interval=20 passes=2 fails=2 udp;
}
     

在上面的例子中,UDP 健康检查之间的时间增加到 20 秒。服务器在连续两次健康检查失败后被认为是不健康的,服务器需要连续两次通过健康检查才能再次被认为是健康的。