Nginx - TCP和UDP负载平衡

Nginx - TCP和UDP负载平衡 首页 / Nginx入门教程 / Nginx - TCP和UDP负载平衡

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

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

配置反向代理

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

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

1.创建一个stream{}块。

stream {
    # ...
}

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

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

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

stream {

    server {
        listen 12345;
        # ...
    }

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

4.添加proxy pass指令以定义代理服务器或服务器将流量转发到的upstream组:

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配置为在连接到upstream服务器时使用特定的源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可以在其中放置来自客户端和upstream连接的数据。如果数据量少,则可以减少缓冲区,这样可以节省内存资源。

链接:https://www.learnfk.comhttps://www.learnfk.com/nginx/nginx-tcp-and-udp-load-balancing.html

来源:LearnFk无涯教程网

如果有大量数据,则可以增加缓冲区的大小以减少套接字的读写操作次数。在一个连接上接收到数据后,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{}上下文中定义upstream{}的一个或多个配置块,并为upstream组设置名称,例如,TCP服务器的 stream_backend dns_servers 对于UDP服务器:

stream {

    upstream stream_backend {
        # ...
    }

    upstream dns_servers {
        # ...
    }

    # ...
}

2.用upstream服务器填充upstream组。在upstream块中,为每个upstream服务器包括一个服务器指令,指定其主机名或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.配置upstream组使用的负载均衡方法。我们可以使用以下方法之一:

Round Robin              - 默认情况下,Nginx使用Round Robin算法来负载均衡流量,并将其顺序引导到已配置的upstream组中的服务器。由于轮询是默认方法,因此没有指令,只需在stream{}上下文中创建一个upstream{}配置块并包含服务器指令。

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

Least Time                 -  此方法仅适用于Nginx Plus。 Nginx选择具有最低平均延迟和最少活动连接数的服务器。参数为:

  • connect     -   连接upstream服务器的时间
  • 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根据用户定义的键选择服务器,例如源IP地址($remote_addr)。

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

Random     -  在这种情况下,每个连接都会传递到随机选择的服务器。如果指定了参数 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服务器定义服务器特定的参数,包括最大连接数,服务器权重等:

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代理相关的功能都在流的块内进行配置。

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

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

透视HTTP协议 -〔罗剑锋(Chrono)〕

苏杰的产品创新课 -〔苏杰〕

设计模式之美 -〔王争〕

Spark核心原理与实战 -〔王磊〕

高楼的性能工程实战课 -〔高楼〕

程序员的个人财富课 -〔王喆〕

搞定音频技术 -〔冯建元 〕

手把手带你搭建推荐系统 -〔黄鸿波〕

结构思考力 · 透过结构看表达 -〔李忠秋〕

好记忆不如烂笔头。留下您的足迹吧 :)