Nginx TCP健康检查

Nginx Plus 和 Nginx 可以不断测试我们的 TCP 上游服务器,避免出现故障的服务器,并将恢复的服务器优雅地纳入负载均衡组.

我们来看看TCP健康检查的配置:

1.我们已经在流上下文中配置了一组上游 TCP 服务器,例如:

stream {
    #...
    upstream stream_backend {
    server backend1.example.com:12345;
    server backend2.example.com:12345;
    server backend3.example.com:12345;
   }
    #...
}

2、我们已经配置了一个将 TCP 连接传递给服务器组的服务器:

stream {
    #...
    server {
        listen     12345;
        proxy_pass stream_backend;
    }
    #...
}

被动 TCP 健康检查

如果尝试连接上游服务器超时或导致错误,Nginx Plus 或 Nginx 开源可以将服务器标记为不可用并停止在规定的时间内向它发送请求。要确定 Nginx 认为上游服务器不可用的条件,请将以下参数添加到服务器指令:

  • 失败超时
  • max_fails
upstream stream_backend {
    server backend1.example.com:12345 weight=5;
    server backend2.example.com:12345 max_fails=2 fail_timeout=30s;
    server backend3.example.com:12346 max_conns=3;
}

服务器慢启动

上游服务器很容易被连接淹没,这可能会导致服务器再次被标记为不可用。慢启动允许上游服务器在恢复或可用后逐渐从零恢复其权重到其标称值。这可以通过上游服务器指令的 slow_start 参数来完成:

upstream backend {
    server backend1.example.com:12345 slow_start=30s;
    server backend2.example.com;
    server 192.0.0.1 backup;
}

主动 TCP 健康检查

可以配置健康检查以测试各种故障类型。例如。 Nginx Plus 可以持续检查上游服务器的响应能力,避免出现故障的服务器。

Nginx Plus 向每个上游服务器发送特殊的健康检查请求,并测试满足特定条件的响应。如果无法建立到服务器的连接,则健康检查失败,服务器被认为是不健康的。

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

启用主动健康检查:

1. 指定共享内存区域-Nginx Plus 工作进程共享有关连接和计数器的状态信息的特殊区域。将区域指令添加到上游服务器组并定义区域(此处为 stream_backend)和内存量(64 KB)。

stream {
    #...
    upstream stream_backend {
        zone   stream_backend 64k;
        server backend1.example.com:12345;
        server backend2.example.com:12345;
        server backend3.example.com:12345;
    }
    #...
}

2、使用 health_check 指令为上游组启用主动健康检查。

stream {
    #...
    server {
        listen        12345;
        proxy_pass    stream_backend;
        health_check;
        #...
    }
}

3、如果需要,使用 health_check_timeout 指令减少两次连续健康检查之间的超时。该 health_check_timeout 指令覆盖了用于健康检查的 proxy_timeout 值,对于健康检查,此超时需要明显更短。

stream {
    #...
    server {
        listen               12345;
        proxy_pass           stream_backend;
        health_check;
        health_check_timeout 5s;
    }
}

4、默认情况下,Nginx Plus 将健康检查消息发送到上游块中 server 指令指定的端口。要覆盖端口,请定义 health_check 指令的端口参数。

stream {
    #...
    server {
        listen               12345;
        proxy_pass           stream_backend;
        health_check         port=12346;
        health_check_timeout 5s;
    }
}

微调 TCP 健康检查

默认情况下,Nginx Plus 每 5 秒尝试连接到一组上游服务器中的每个服务器。如果无法建立连接,Nginx Plus 认为健康检查失败,将服务器标记为不健康,并停止将客户端连接转发到服务器。

要更改默认行为,请向 health_check 指令添加参数:

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

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

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

stream {
    #...
    server {
        listen       12345;
        proxy_pass   stream_backend;
        health_check interval=10 passes=2 fails=3;
    }
    #...
}

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

下一章:Nginx UDP健康检查

Nginx UDP 健康检查:在这里,我们将讨论如何为负载均衡的上游服务器组中的 UDP(用户数据报协议)服务器配置不同类型的健康检查。我们已经配置了一组上游服务器来处理流{}上下文中的UDP网络流量(DNS、RADIUS、Syslog), ...