负载均衡是指在多个后端服务器之间有效分配网络流量。从NGINXPlusR5[1]版本开始,可以代理和负载均衡传输控制协议(TransmissionControlProtocol,TCP)通信。TCP是许多流行的应用程序和服务的协议,例如LDAP、MySQL和RTMP。从NGINXPlusR9[2]开始,它可以代理和负载平衡UDP流量。用户数据报协议(UDP)是许多流行的非事务性应用程序的协议,例如DNS、系统日志和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模块中几个元素的语法:stream块,也就是配置文件中的***块,与http块属于同一级别。语法如下:Syntax:stream{...}Default:—Context:mainserverblock,配置一个服务。在***stream{}上下文中为每个虚拟服务器定义一个或多个服务器配置块。语法如下:Syntax:server{...}Default:—Context:streamlisten命令,设置服务器接受连接的socket地址和端口。只能指定端口。地址也可以是主机名,例如:Syntax:listenaddress:port[ssl][udp][proxy_protocol][backlog=number][rcvbuf=size][sndbuf=size][bind][ipv6only=on|off][reuseport][so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];Default:—Context:server示例如下:listen127.0.0.1:12345;listen*:12345;listen12345;#同*:12345listenlocalhost:12345;listen命令的默认协议是TCP协议。对于UDP流,需要指定udp参数,如下:listen12345udp;B、使用ngx_stream_proxy_module模块(默认编译)的proxy_pass命令配置代理。proxy_pass命令语法:Syntax:proxy_passaddress;Default:—Context:server设置代理服务器的地址。地址可以定义为域名或IP地址和端口号:proxy_passlocalhost:12345;或UNIX域套接字路径:proxy_passunix:/tmp/stream.socket;C.如果代理服务器有多个网络接口,NGINX可以配置为使用特定的源IP地址连接上游服务器。当代理服务器位于nginx后面并配置为接受来自特定IP网络或IP地址范围的连接时,这可能很有用。使用ngx_stream_proxy_module模块的proxy_bind指令,其语法:Syntax:proxy_bindaddress[transparent]|off;Default:—Context:stream,server#该指令从1.9.2版本开始使用。从指定的本地IP地址发起到代理服务器的外部连接。特殊值off取消了上层配置继承的proxy_bind指令的作用,让系统自动分配本地IP地址。透明参数(1.11.0+)允许从非本地IP地址到代理服务器的外部连接,例如从客户端的真实IP地址:proxy_bind$remote_addrtransparent;要使此参数起作用,通常需要超级用户权限运行nginx工作进程。在Linux上,不需要(1.13.8+),就像指定了透明参数一样,worker进程从master进程继承了CAP_NET_RAW能力。还需要配置核心路由表以拦截来自代理服务器的网络流量。示例配置如下:stream{#...server{listen127.0.0.1:12345;proxy_passbackend.example.com:12345;proxy_buffer_size16k;#proxy_bind127.0.0.1:12345;}}负载均衡使用ngx_stream_upstream_module模块(默认是编译传入的)upstream命令。指令语法:Syntax:upstreamname{...}Default:—Context:stream定义一组服务器。服务器可以监听不同的端口。此外,可以混合监听TCP和UNIX域套接字的服务器。在***stream{}上下文中定义一个或多个upstream{}配置块,并设置upstream组的名称,如TCP服务器为stream_backend,UDP服务器为dns_servers:stream{upstreamstream_backend{serverbackend1.example.com:12345;serverbackend2.example.com:12345;serverbackend3.example.com:12346;}upstreamdns_servers{server192.168.136.130:53;server192.168.136.131:53;}}配置上游组使用的负载均衡方式。可以指定以下方法之一:1.RoundRobin:默认情况下,NGINX使用循环算法来负载平衡流,将它们按顺序指向配置的上游组中的服务器。因为它是默认方法,所以没有循环指令;只需在***stream{}上下文中创建一个upstream{}配置块,2.LeastConnections–nginx选择当前活动连接数较少的服务器。Syntax:least_conn;Default:—Context:upstream3.LeastTime—NGINXPlus选择平均延迟最低***和活动连接数最少的服务器。用于计算最大平均延迟的方法取决于least_time指令中包含以下哪些参数:语法:least_timeconnect|first_byte|last_byte[inflight];默认值:—上下文:upstreamA.connect-连接到上游服务器B的时间.first_byte-接收数据第一个字节的时间C.last_byte-从服务器接收到完整响应的时间,如果指定了inflight参数(1.11.6+),不完整的连接也会被考虑在内。4.Hash-NGINX根据用户定义的密钥选择服务器。Syntax:hashkey[consistent];Default:—Context:upstreamHash负载均衡方式也用于配置会话持久化。由于散列函数基于客户端IP地址,因此来自给定客户端的连接始终会传递到同一台服务器,除非服务器已关闭或不可用。指定可选的一致性参数以应用ketama一致性哈希方法:hash$remote_addrconsistent;5.random-每个连接将被传递到一个随机选择的服务器。如果指定two参数,首先,NGINX会考虑服务器权重随机选择两台服务器,然后使用指定的方法选择其中一台服务器:语法:random[two[method]];Default:--Context:upstream这个指令出现了在版本1.15.1.A中。least_conn-最少活动连接数B.least_time=connect-连接到上游服务器的时间($upstream_connect_time)=last_byte-从服务器接收最后一个字节数据的平均时间($upstream_session_time)随机负载平衡方法应该用于多个负载平衡器将请求传递到同一组后端环境的分配。示例:stream{upstreamstream_backend{hash$remote_addrconsistent;serverbackend1.example.com:12345weight=5;serverbackend2.example.com:12345;serverbackend3.example.com:12346max_conns=3;}upstreamdns_servers{least_conn;server192.168.136。130:53;server192.168.136.131:53;}}完整示例流{upstream_backend{hash$remote_addrconsistent;serverbackend1.example.com:12345weight=5;serverbackend2.example.com:12345;serverbackend3.example.com:12346max_conns=3;}upstreamdns_servers{least_conn;server192.168.136.130:53;server192.168.136.131:53;}服务器{listen12345;proxy_passstream_backend;proxy_buffer_size16k;#proxy_bind127.0.0.1:12345;}服务器{listen53udp;proxy_passdns_servers;proxy_buffer_size16k;}}绑定[1]:https://docs.nginx.com/nginx/releases/#r5[2]:https://docs.nginx.com/nginx/releases/#r9
