NGINX TCP和UDP负载均衡

本文概述

  • 配置反向代理
  • 配置TCP或UDP负载均衡
Nginx Plus可以代理和负载均衡TCP(传输控制协议)流量。 TCP是许多流行的应用程序和服务(例如MySQL, LDAP和RTMP)的协议。
同样, Nginx Plus可以代理和负载均衡UDP流量。用户数据报协议(UDP)是许多流行的非事务性应用程序(例如DNS, Syslog和RADIUS)的协议。
配置反向代理首先, 我们需要配置反向代理, 以便Nginx开源或Nginx Plus可以将TCP连接或UDP数据报从客户端转发到上游组或代理服务器。
使用Nginx配置文件并执行以下步骤:
1.创建一个顶级流{}块。
stream { # ... }

2.在顶级流{}上下文中为每个虚拟服务器定义一个或多个服务器{}配置块。
3.在服务器{}配置块中, 包括每个服务器的listen指令, 以定义IP地址和/或服务器在其上侦听的端口。
对于UDP流量, 还添加UDP参数。由于TCP是流上下文的默认协议, 因此没有要监听指令的TCP参数:
stream {server { listen 12345; # ... }server { listen 53 udp; # ... } # ... }

4.添加proxy pass指令以定义代理服务器或服务器将流量转发到的上游组:
stream {server { listen12345; # traffic of TCP will be forwarded to the "stream_backend" upstream group proxy_pass stream_backend; }server { listen12346; #traffic of TCP will be forwarded to the specified server proxy_pass backend.example.com:12346; }server { listen53 udp; #traffic of UDP will be forwarded to the "dns_servers" upstream group proxy_pass dns_servers; } # ... }

5.如果代理服务器具有许多不同的网络接口, 则可以选择将Nginx配置为在连接到上游服务器时使用特定的源IP地址。
添加proxy_bind指令和相应网络接口的IP地址。
stream { # ... server { listen127.0.0.1:12345; proxy_pass backend.example.com:12345; proxy_bind 127.0.0.1:12345; } }

6.(可选)我们可以调整两个内存缓冲区的大小, nginx可以在其中放置来自客户端和上游连接的数据。如果数据量少, 则可以减少缓冲区, 这可以节省内存资源。
如果有大量数据, 则可以增加缓冲区的大小以减少套接字读写操作的次数。一旦在一个连接上接收到数据, Nginx将读取该数据并将其通过另一连接转发。要控制缓冲区, 请使用proxy_buffer_size指令:
stream { # ... server { listen127.0.0.1:12345; proxy_passbackend.example.com:12345; proxy_buffer_size 16k; } }

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

2.用上游服务器填充上游组。在上游块中, 为每个上游服务器包括一个服务器指令, 指定其主机名或IP地址以及强制性的端口号。
stream {upstream stream_backend { server backend1.example.com:12345; server backend2.example.com:12345; server backend3.example.com:12346; # ... }upstream dns_servers { server 192.168.136.130:53; server 192.168.136.131:53; # ... }# ... }

3.配置上游组使用的负载均衡方法。我们可以使用以下方法之一:
Round Robin:默认情况下, Nginx使用Round Robin算法来负载均衡流量, 并将其顺序地定向到配置的上游组中的服务器。由于轮询是默认方法, 因此没有指令。
只需在顶级流{}上下文中创建一个上游{}配置块, 并包含服务器指令。
最少的连接:Nginx选择当前活动连接最少的服务器。
最短时间:此方法仅适用于Nginx Plus。 Nginx选择具有最低平均延迟和最少活动连接数的服务器。参数为:
  • connect-连接到上游服务器的时间
  • first_byte-接收数据再见的时间
  • last_byte-从服务器接收完整响应的时间。
upstream stream_backend { least_time first_byte; server backend1.example.com:12345; server backend2.example.com:12345; server backend3.example.com:12346; }

哈希:Nginx根据用户定义的键选择服务器, 例如源IP地址($ remote_addr)。
upstream stream_backend { hash $remote_addr; server backend1.example.com:12345; server backend2.example.com:12345; server backend3.example.com:12346; }

随机:在这种情况下, 每个连接都会传递到随机选择的服务器。如果指定了参数2, 则首先Nginx考虑服务器权重随机选择两个服务器, 然后使用指定的服务器选择这些服务器之一。
  • Least_conn-最少活动连接数。
  • minimum_time =标头-从服务器接收响应标头的最短平均时间。
  • Least_time = last_byte-从服务器接收完整响应的最短平均时间。
upstream stream_backend { random two least_time=last_byte; server backend1.example.com:12345; server backend2.example.com:12345; server backend3.example.com:12346; server backend4.example.com:12346; }

4.(可选)为每个上游服务器定义服务器特定的参数, 包括最大连接数, 服务器权重等:
upstream stream_backend { hash$remote_addr consistent; server backend1.example.com:12345 weight=5; server backend2.example.com:12345; server backend3.example.com:12346 max_conns=3; } upstream dns_servers { least_conn; server 192.168.136.130:53; server 192.168.136.131:53; # ... }

TCP和UDP负载均衡配置示例
【NGINX TCP和UDP负载均衡】让我们看一下TCP和UDP负载均衡配置的示例:
stream { upstream stream_backend { least_conn; server backend1.example.com:12345 weight=5; server backend2.example.com:12345 max_fails=2 fail_timeout=30s; server backend3.example.com:12345 max_conns=3; }upstream dns_servers { least_conn; server 192.168.136.130:53; server 192.168.136.131:53; server 192.168.136.132:53; }server { listen12345; proxy_passstream_backend; proxy_timeout 3s; proxy_connect_timeout 1s; }server { listen53 udp; proxy_pass dns_servers; }server { listen12346; proxy_pass backend4.example.com:12346; } }

在上面的示例中, 所有与TCP和UDP代理相关的功能都在流的块内进行配置。
有两个名为上游的块, 每个块包含三个托管彼此相同内容的服务器。在每个服务器的服务器中, 服务器名称后跟必需的端口号。根据最小连接负载均衡方法, 连接在所有服务器之间分配:连接到具有较少活动连接的服务器。

    推荐阅读