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