Nginx 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.在 server { } 配置块中,包含每个服务器的 listen 指令以定义服务器侦听的 IP 地址和/或端口。

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

stream {
    server {
        listen 12345;
        # ...
    }
    server {
        listen 53 udp;
        # ...
    }
    # ...
}

4、添加代理传递指令以定义代理服务器或服务器转发流量的上游组:

stream {
    server {
        listen     12345;
        # traffic of TCP will be forwarded to the "stream_backend" upstream group
        proxy_pass stream_backend;
    }
    server {
        listen     12346;
        #traffic of TCP will be forwarded to the specified server
        proxy_pass backend.example.com:12346;
    }
    server {
        listen     53 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 {
        listen     127.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 {
        listen            127.0.0.1:12345;
        proxy_pass        backend.example.com:12345;
        proxy_buffer_size 16k;
    }
}

配置 TCP 或 UDP 负载平衡

配置 TCP 或 UDP 负载平衡:

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

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;
}

Hash: Nginx根据用户自定义的key选择服务器,例如源IP地址($remote_addr)。

upstream stream_backend {
    hash $remote_addr;
    server backend1.example.com:12345;
    server backend2.example.com:12345;
    server backend3.example.com:12346;
}

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

  • Least_conn-最少活动连接数。
  • least_time= header-从服务器接收响应标头的最少平均时间。
  • 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负载均衡配置示例

我们来看一个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 {
        listen        12345;
        proxy_pass    stream_backend;
        proxy_timeout 3s;
        proxy_connect_timeout 1s;
    }
    
    server {
        listen     53 udp;
        proxy_pass dns_servers;
    }
    
    server {
        listen     12346;
        proxy_pass backend4.example.com:12346;
    }
}

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

有两个命名上游块,每个块包含三个托管相同的服务器内容为彼此。在每个服务器的服务器中,服务器名称后跟必需的端口号。连接按照最少连接数负载均衡的方式分布在所有服务器上: 一个连接到达活动连接数较少的服务器。

下一章:Nginx 清除缓存

Nginx 可以从缓存中删除旧的和过时的缓存文件。必须删除过时的缓存内容,以防止同时提供新旧版本的网页。收到包含自定义 HTTP 标头或 HTTP PURGE 方法的特殊"清除"请求时,将清除(清理)缓存。配置缓存清除 ...