Nginx的UDP健康检查
本章介绍如何为负载平衡的上游服务器组中的UDP服务器配置不同类型的运行状况检查。
先决条件
-
您已配置上下文中的上游服务器组来处理UDP网络流量(DNS,RADIUS,系统日志),例如:
stream {}
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; } #... }
有关详细信息,请参见TCP和UDP负载平衡。
被动UDP健康检查
如果服务器回复错误或超时,则NGINX开源或NGINX Plus可以将服务器标记为不可用,并在一段时间内停止向其发送UDP数据报。
max_fails
使用上游服务器的参数设置在特定时间段内连续失败的连接尝试次数(默认值为1
)。
时间段由fail_timeout
参数设置(默认值为10
秒)。该参数还设置了NGINX标记服务器后认为服务器不可用的时间。
因此,如果连接尝试超时或在10秒内至少失败一次,NGINX会将服务器标记为10秒钟不可用。该示例显示了如何在60秒内将这些参数设置为2次失败:
upstream dns_upstream {
server 192.168.136.130:53 fail_timeout=60s;
server 192.168.136.131:53 fail_timeout=60s;
}
主动UDP运行状况检查
Active Health Checks可以测试各种故障类型,并且仅适用于NGINX Plus。例如,NGINX Plus不会等待将DNS客户端发出的实际TCP请求失败,然后再将DNS服务器标记为已关闭(例如在被动运行状况检查中),而是将特殊的运行状况检查请求发送到每个上游服务器,并检查是否存在响应满足某些条件。如果无法建立与服务器的连接,则运行状况检查将失败,并且服务器将被视为运行状况不佳。NGINX Plus不会将客户端连接代理到运行状况不佳的服务器。如果定义了多个运行状况检查,则任何检查失败都会足以使相应的上游服务器不正常。
要启用主动健康检查:
-
在上游组中,指定一个共享存储器区与所述
zone
指令-其中NGINX加工作进程有关计数器和连接共享状态信息的特殊区域。在zone
指令中,指定区域名称(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; } #... }
-
在
server
将流量转发到上游组(通过proxy_pass
)的块中,udp
为health_check
伪指令指定参数:stream { #... server { listen 53 udp; proxy_pass dns_upstream; health_check udp; } #... }
基本的UDP运行状况检查假设NGINX Plus将“ nginx运行状况检查”字符串发送到上游服务器,并期望响应中缺少ICMP“目标不可达”消息。您可以在match
{}
块中配置自己的健康检查测试。有关详细信息,请参见“ match {}”配置块。
微调UDP运行状况检查
您可以通过为health_check
指令指定以下参数来微调运行状况检查:
interval
– NGINX Plus发送健康检查请求的频率(以秒为单位)(默认为5秒)passes
–服务器必须响应才能被视为健康的连续健康检查次数(默认为1)fails
–服务器必须不响应才能被视为不健康的连续健康检查次数(默认为1)
server {
listen 53 udp;
proxy_pass dns_upstream;
health_check interval=20 passes=2 fails=2 udp;
}
在此示例中,两次UDP健康检查之间的时间增加到20秒,在两次连续失败的健康检查之后服务器被视为不健康,并且服务器需要通过两次连续检查才能再次被视为健康。
“ match {}”配置块
您可以通过配置许多测试来验证服务器对运行状况检查的响应。这些测试在match
{}
配置块中定义。
-
在顶级
stream
{}
上下文中,指定match
{}
块并设置其名称,例如udp_test
:stream { #... match udp_test { #... } }
-
health_check
通过包含match
参数以指定match
{}
块的名称来引用指令中的块:stream { #... server { listen 53 udp; proxy_pass dns_upstream; health_check match=udp_test udp; } #... }
-
在
match
{}
块中,指定运行状况检查成功的条件或测试。这是通过send
和expect
参数完成的:这些参数可以以不同的组合使用,但
send
一次expect
最多只能指定一个参数。
NTP测试示例
要微调NTP的运行状况检查,应同时使用以下文本字符串指定send
和expect
参数:
match ntp {
send \xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;
expect ~* \x24;
}
DNS测试示例
要微调DNS的运行状况检查,还应该同时使用以下文本字符串指定send
和expect
参数:
match dns {
send \x00\x2a\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03\x73\x74\x6c\x04\x75\x6d\x73\x6c\x03\x65\x64\x75\x00\x00\x01\x00\x01;
expect ~* "health.is.good";
}