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 秒。服务器在连续两次健康检查失败后被认为是不健康的,服务器需要连续两次通过健康检查才能再次被认为是健康的。