NGINX TCP 和 UDP 负载均衡

2024 年 8 月 29 日 | 5 分钟阅读

Nginx Plus 可以代理和负载均衡 TCP (传输控制协议) 流量。 TCP 是许多流行的应用程序和服务的协议,例如 MySQL、LDAP 和 RTMP。

同样,Nginx Plus 可以代理和负载均衡 UDP 流量。用户数据报协议 (UDP) 是许多流行的非事务性应用程序的协议,例如 DNS、Syslog 和 RADIUS。

配置反向代理

首先,我们需要配置反向代理,以便 Nginx 开源版或 Nginx Plus 可以将来自客户端的 TCP 连接或 UDP 数据报转发到上游组或代理服务器。

使用 Nginx 配置文件并执行以下步骤

1. 创建一个顶级 stream { } 块。

2. 在顶级 stream { } 上下文中,为每个虚拟服务器定义一个或多个 server { } 配置块。

3. 在 server { } 配置块中,为每个服务器包含 listen 指令,以定义服务器侦听的 IP 地址和/或端口。

对于 UDP 流量,还添加 UDP 参数。 由于 TCP 是流上下文的默认协议,因此 listen 指令没有 TCP 参数

4. 添加 proxy_pass 指令以定义服务器将流量转发到的代理服务器或上游组

5. 如果代理服务器有多个不同的网络接口,您可以选择配置 Nginx 在连接到上游服务器时使用特定的源 IP 地址。

添加 proxy_bind 指令以及相应网络接口的 IP 地址。

6. (可选)我们可以调整两个内存缓冲的大小,nginx 可以在其中放置来自客户端和上游连接的数据。 如果数据量很小,可以减少缓冲区,这可以节省内存资源。

如果数据量很大,可以增加缓冲区的大小,以减少套接字读写操作的次数。 一旦在一个连接上收到数据,Nginx 就会读取它并通过另一个连接转发它。 要控制缓冲区,请使用 proxy_buffer_size 指令


配置 TCP 或 UDP 负载均衡

要配置 TCP 或 UDP 负载均衡

1. 首先,创建一个服务器组或一个上游组,其流量将被负载均衡。 在顶级 stream { } 上下文中定义一个或多个 upstream { } 配置块,并为上游组设置名称,例如,TCP 服务器使用 stream_backend,UDP 服务器使用 dns_servers

2. 使用上游服务器填充上游组。 在 upstream 块中,为每个上游服务器包含一个 server 指令,指定其主机名或 IP 地址以及必需的端口号。

3. 配置上游组使用的负载均衡方法。 我们可以使用以下方法之一

轮询: Nginx 默认使用轮询算法来负载均衡流量,按顺序将其定向到配置的上游组中的服务器。 因为轮询是默认方法,所以没有相应的指令。

只需在顶级 stream { } 上下文中创建一个 upstream {} 配置块,并包含 server 指令即可。

最少连接: Nginx 选择当前活动连接数最少的服务器。

最少时间: 此方法仅适用于 Nginx Plus。 Nginx 选择平均延迟最低且活动连接数最少的服务器。 参数为

  • connect - 连接到上游服务器的时间
  • first_byte - 接收数据第一个字节的时间
  • last_byte - 接收来自服务器的完整响应的时间。

哈希: 基于用户定义的键,Nginx 选择服务器,例如,源 IP 地址 ($remote_addr)。

随机: 在这种情况下,每个连接都传递给随机选择的服务器。 如果指定了参数 two,则首先 Nginx 随机选择两个服务器,同时考虑服务器权重,然后使用指定的服务器选择其中一个服务器。

  • Least_conn- 活动连接数最少。
  • least_time= header - 从服务器接收响应标头的最短平均时间。
  • Least_time=last_byte - 从服务器接收完整响应的最短平均时间。

4. (可选)为每个上游服务器定义特定于服务器的参数,包括最大连接数服务器权重等等

TCP 和 UDP 负载均衡配置示例

让我们看一个 TCP 和 UDP 负载均衡配置的示例

在上面的示例中,所有与 TCP 和 UDP 代理相关的功能都在流的块内配置。

有两个名为 upstream 的块,每个块包含三个服务器,这些服务器彼此托管相同的内容。 在每个服务器的 server 中,服务器名称后跟必需的端口号。 连接根据最少连接负载均衡方法分配给所有服务器:连接转到活动连接数最少的服务器。