模块 ngx_stream_upstream_hc_module

示例配置
指令
     health_check
     health_check_timeout
     match

模块 ngx_stream_upstream_hc_module(1.9.0 版本)允许对中的服务器进行定期健康检查。服务器组必须驻留在共享内存中。

如果健康检查失败,服务器将被视为不健康。如果为同一组服务器定义了多个健康检查,则任何检查的单个失败都将使相应的服务器被视为不健康。客户端连接不会传递给不健康的服务器和处于“checking”状态的服务器。

该模块作为我们的商业订阅的一部分提供。

示例配置

upstream tcp {
    zone upstream_tcp 64k;

    server backend1.example.com:12345 weight=5;
    server backend2.example.com:12345 fail_timeout=5s slow_start=30s;
    server 192.0.2.1:12345            max_fails=3;

    server backup1.example.com:12345  backup;
    server backup2.example.com:12345  backup;
}

server {
    listen     12346;
    proxy_pass tcp;
    health_check;
}

使用此配置,nginx 将每五秒检查 tcp 组中每个服务器建立 TCP 连接的能力。当无法建立与服务器的连接时,健康检查将失败,并且服务器将被视为不健康。

可以为 UDP 协议配置健康检查:

upstream dns_upstream {

    zone   dns_zone 64k;

    server dns1.example.com:53;
    server dns2.example.com:53;
    server dns3.example.com:53;
}

server {
    listen       53 udp;
    proxy_pass   dns_upstream;
    health_check udp;
}

在这种情况下,预期在回复发送的字符串“nginx health check”时不会有 ICMP “Destination Unreachable”消息。

还可以配置健康检查以测试从服务器获取的数据。测试是使用 match 指令分别配置的,并在 health_check 指令的 match 参数中引用。

指令

语法: health_check [参数];
默认值:
上下文: server

启用对中的服务器进行定期健康检查。

支持以下可选参数:

间隔=时间
设置两次连续健康检查之间的间隔,默认为5秒。
抖动=时间
设置每次健康检查将随机延迟的时间范围,默认情况下没有延迟。
失败次数=次数
设置特定服务器连续失败的健康检查次数,在此之后该服务器将被视为不健康,默认为1次。
通过次数=次数
设置特定服务器连续通过的健康检查次数,在此之后该服务器将被视为健康,默认为1次。
必须检查 [持久]

设置服务器的初始“检查”状态,直到完成第一次健康检查(1.11.7)。 在“检查”状态下,不会将客户端连接传递给服务器。 如果未指定该参数,则服务器将最初被视为健康。

参数 持久(1.21.1)设置了服务器在重新加载后如果服务器在重新加载前被视为健康,则服务器的初始“上线”状态。

匹配=名称
指定了match块,配置了成功连接必须通过的测试,以便健康检查通过。 默认情况下,对于TCP,仅检查与服务器建立TCP连接的能力。 对于UDP,预期在发送字符串“nginx health check”的回复中不会收到ICMP“目的地不可达”消息。
在版本1.11.7之前,默认情况下,UDP健康检查需要带有match块和sendexpect参数。
端口=数字
定义连接到服务器执行健康检查时使用的端口(1.9.7)。 默认情况下,等于server端口。
udp
指定应使用UDP协议进行健康检查,而不是默认的TCP协议(1.9.13)。

语法: health_check_timeout 超时;
默认:
health_check_timeout 5s;
上下文: stream, server

覆盖了健康检查的proxy_timeout值。

语法: match name { ... }
默认:
上下文: stream

定义了用于验证服务器对健康检查响应的命名测试集。

可以配置以下参数:

send string;
发送一个string到服务器;
expect string | ~ regex;
一个文字字符串(1.9.12)或者从服务器获取的数据应该匹配的正则表达式。正则表达式是用前缀“~*”(不区分大小写匹配)或者“~”(区分大小写匹配)修饰的。

`send`和`expect`参数都可以包含带有前缀“\x”后跟两个十六进制数字的十六进制文字,例如“\x80”(1.9.12)。

健康检查通过的条件:

示例:

upstream backend {
    zone     upstream_backend 10m;
    server   127.0.0.1:12345;
}

match http {
    send     "GET / HTTP/1.0\r\nHost: localhost\r\n\r\n";
    expect ~ "200 OK";
}

server {
    listen       12346;
    proxy_pass   backend;
    health_check match=http;
}

仅检查来自服务器的前proxy_buffer_size字节的数据。