Nginx负载均衡 -  TCP/UDP流

发布者:上海IT外包来源:http://www.lanmon.net点击数:716

从NGINX Plus R5 [1]版本开始,可以代理和负载平衡传输控制协议(TCP)通信。 TCP是许多流行应用程序和服务的协议,例如LDAP,MySQL和RTMP。
代理和负载平衡UDP流量可以从NGINX Plus R9 [2]版本启动。用户数据报协议(UDP)是许多流行的非事务性应用程序(如DNS,syslog和RADIUS)的协议。
反向代理
基本情况
需要ngx_stream_core_module模块,从版本1.9.0开始提供。此模块不是默认构建的,需要使用--with-stream配置参数启用。以下配置:
./configure --prefix=/usr/local/nginx --with-stream
配置反向代理
配置反向代理,以便NGINX可以打开资源并将TCP连接或UDP数据报从客户端转发到上游或代理服务器。
A.在配置反向代理之前,请查看ngx_stream_core_module模块中几个元素的语法:
流块是配置文件中的顶级块,属于与http块相同的级别。语法如下:
语法: stream {.}
默认值:  -
上下文:主要
服务器块,配置服务。为顶级流{}上下文中的每个虚拟服务器定义一个或多个服务器配置块。语法如下:
语法: server {.}
默认值:  -
上下文:流
listen命令设置服务器将接受的套接字的地址和端口。您只能指定端口。地址也可以是主机名,例如:语法:监听地址:端口[ssl] [udp] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [bind] [ipv6only=on | off] [reuseport] [so_keepalive=on | off | [keepidle]: [keepintvl]: [keepcnt]];
默认值:  -
上下文:服务器
一个例子如下:
听127.0.0.1: 12345;
听*: 12345;
听12345; #与*: 12345相同
听localhost: 12345;
此默认协议中的listen命令是TCP协议。对于UDP流,您需要指定udp参数,如下所示:
听12345 udp;
B.使用ngx_stream_proxy_module模块的proxy_pass指令(默认情况下编译)来配置proxy,proxy_pass指令语法:
语法: proxy_pass address;
默认值:  -
上下文:服务器
设置代理服务器的地址。地址可以定义为域名或IP地址和端口号:
Proxy_pass localhost: 12345;
或UNIX域套接字路径:
Proxy_pass unix: /tmp/stream.socket;
C.如果代理服务器有多个网络接口,您可以配置NGINX使用特定的源IP地址连接到上游服务器。当代理服务器位于nginx后面并配置为接受来自特定IP网络或IP地址范围的连接时,这非常有用。
使用ngx_stream_proxy_module模块的proxy_bind指令,语法如下:
语法: proxy_bind address [transparent] |关闭;
默认值:  -
上下文:流,服务器
#This指令在版本1.9.2中使用。启动从指定本地IP地址到代理服务器的外部连接。特殊值off取消了从上层配置继承的proxy_bind指令的效果,允许系统自动分配本地IP地址。
透明参数(1.11.0+)允许从非本地IP地址到代理服务器的外部连接,例如来自客户端的真实IP地址:
Proxy_bind $ remote_addr transparent;
为了使此参数起作用,通常需要以超级用户权限运行nginx工作进程。在Linux上,您不需要(1.13.8+)。正如您指定透明参数一样,工作进程从主进程继承CAP_NET_RAW函数。您还需要配置核心路由表以拦截来自代理服务器的网络流量。
示例配置如下:
流{
#.
服务器{
听127.0.0.1: 12345;
Proxy_pass backend.example.com: 12345;
Proxy_buffer_size 16k;
#proxy_bind 127.0.0.1: 12345;
}
}
负载均衡
使用ngx_stream_upstream_module模块的上游指令(默认情况下编译)。指令语法:
语法:上游名{.}
默认值:  -
上下文:流
定义一组服务器。服务器可以侦听不同的端口。此外,您可以混合侦听TCP和UNIX域套接字的服务器。
在顶级流{}上下文中定义一个或多个上游{}配置块,并设置上游组的名称,例如TCP服务器的stream_backend和UDP服务器的dns_servers:
流{
上游stream_backend {
服务器backend1.example.com: 12345;
服务器backend2.example.com: 12345;服务器backend3.example.com: 12346;
}
上游dns_servers {
服务器192.168.136.130: 53;
服务器192.168.136.131: 53;
}
}
配置上游组使用的负载均衡方法。您可以指定以下方法之一:
1.循环:默认情况下,NGINX使用循环算法对流进行负载平衡,将它们指向已配置上游组中的服务器。因为它是默认方法,所以没有循环指令;只需在顶级流{}上下文中创建上游{}配置块。
2.最少连接 -  nginx选择活动连接较少的服务器。
语法: least_conn;
默认值:  -
上下文:上游
3.最短时间 -  NGINX Plus选择平均延迟最低且活动连接最少的服务器。用于计算最低平均延迟的方法取决于least_time指令中包含以下哪个参数:
语法: least_time connect | first_byte | last_byte [inflight];
默认值:  -
上下文:上游
A. connect  - 连接上游服务器的时间
B. first_byte  - 接收数据的第一个字节的时间
C. last_byte  - 从服务器接收完整响应的时间。如果指定了inflight参数(1.11.6+),则还会考虑不完整的连接。
4.哈希 -  NGINX根据用户定义的密钥选择服务器。
语法:哈希键[一致];
默认值:  -
上下文:上游
Hash负载平衡方法还用于配置会话持久性。由于散列函数基于客户端IP地址,因此除非服务器已关闭或不可用,否则来自给定客户端的连接始终会传递到同一服务器。指定可选的一致参数以应用ketama一致哈希方法:哈希$ remote_addr一致;
5.random  - 每个连接将传递给随机选择的服务器。如果指定了两个参数,首先,NGINX会考虑服务器权重随机选择两台服务器,然后使用指定的方法选择其中一台服务器:
语法: random [two [method]];默认值:  - 上下文: upstreamThis指令出现在1.15.1版本中。
A. least_conn  - 活动连接的最少数量
B. least_time=connect  - 连接到上游服务器的时间($ upstream_connect_time)缺少美元符号
C. least_time=first_byte  - 从服务器接收第一个数据字节的最短时间($ upstream_first_byte_time)
D. least_time=last_byte  - 从服务器接收最后一个数据字节的最短时间($ upstream_session_time)
随机负载平衡方法应该在分布式环境中使用,其中多个负载均衡器将请求传递给同一组后端。
例:
流{
上游stream_backend {
哈希$ remote_addr一致;
服务器backend1.example.com: 12345权重=5;
服务器backend2.example.com: 12345;
服务器backend3.example.com: 12346 max_conns=3;
}
上游dns_servers {
Least_conn;
服务器192.168.136.130: 53;
服务器192.168.136.131: 53;
}
}
完整的例子
流{
上游stream_backend {
哈希$ remote_addr一致;服务器backend1.example.com: 12345权重=5;
服务器backend2.example.com: 12345;
服务器backend3.example.com: 12346 max_conns=3;
}
上游dns_servers {
Least_conn;
服务器192.168.136.130: 53;
服务器192.168.136.131: 53;
}
服务器{
听12345;
Proxy_pass stream_backend;
Proxy_buffer_size 16k;
#proxy_bind 127.0.0.1: 12345;
}
服务器{
听53 udp;
Proxy_pass dns_servers;
Proxy_buffer_size 16k;
IT外包
>
400-635-8089
立即
咨询
电话咨询
服务热线
400-635-8089
微信咨询
微信咨询
微信咨询
公众号
公众号
公众号
返回顶部