📅  最后修改于: 2021-01-07 06:19:43             🧑  作者: Mango
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 {
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负载平衡:
1.首先,创建一组服务器或一个上游组,其流量将进行负载均衡。在顶层流{}上下文定义上游{}中的一个或多个配置块和用于上游组设置的名称,例如,对于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选择具有最低平均延迟和最少活动连接数的服务器。参数为:
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考虑服务器权重随机选择两个服务器,然后使用指定的服务器选择其中一个服务器。
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负载平衡配置的示例:
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代理相关的功能都在流的块内进行配置。
有两个名为上游的块,每个块包含三个托管彼此相同内容的服务器。在服务器上为每个服务器,服务器名称后面是强制性的端口号。根据最小连接负载平衡方法,连接在所有服务器之间分配:连接到具有较少活动连接的服务器。