负载均衡是指在多个后端服务器之间有效地分配网络流量.
从 NGINX Plus R5[1] 版本开始可以代理和负载均衡传输控制协议 (Transmission Control Protocol,TCP) 通信. TCP 是许多流行应用程序和服务的协议, 如 LDAP,MySQL 和 RTMP.
从 NGINX Plus R9[2]版本开始可以代理和负载平衡 UDP 流量. 用户数据报协议 (User Datagram Protocol,UDP) 是许多流行的非事务性应用程序的协议, 如 DNS,syslog 和 RADIUS.
反向代理
基础条件
需要使用 ngx_stream_core_module 模块, 该模块从版本 1.9.0 开始可用. 这个模块在默认情况下是不构建的, 需使用 --with-stream 配置参数来启用它. 如下配置:
./configure --prefix=/usr/local/nginx --with-stream
配置反向代理
配置反向代理, 以便 NGINX 打开资源, 将来自客户端的 TCP 连接或 UDP 数据报转发到 upstream 组或代理服务器.
A. 配置反向代理之前, 看一下 ngx_stream_core_module 模块中几个元素的语法:
stream 块, 在配置文件中是顶级块, 和 http 块属于同一级别, 语法如下:
- Syntax: stream {
- ...
- }
- Default: -
- Context: main
server 块, 配置一个服务. 在顶级 stream{}上下文中为每个虚拟服务器定义一个或多个服务器配置块. 语法如下:
- Syntax: server {
- ...
- }
- Default: -
- Context: stream
listen 指令, 设置服务器将接受连接的套接字的地址和端口. 可以只指定端口. 地址也可以是主机名, 例如:
- Syntax: listen address: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
示例如下:
- listen 127.0.0.1:12345;
- listen *:12345;
- listen 12345; # same as *:12345
- listen localhost:12345;
listen 指令在此默认协议是 TCP 协议, 对于 UDP 流, 需要指定 udp 参数, 如下:
listen 12345 udp;
B. 使用 ngx_stream_proxy_module 模块 (默认是编译进来的) 的 proxy_pass 指令配置代理, proxy_pass 指令语法:
- Syntax: proxy_pass address;
- Default: -
- Context: server
设置被代理服务器的地址. 地址可以定义为一个域名或 IP 地址和一个端口号:
proxy_pass localhost:12345;
或一个 UNIX-domain socket 路径:
proxy_pass unix:/tmp/stream.socket;
C. 如果代理服务器有多个网络接口, 可以配置 NGINX 使用特定的源 IP 地址去连接 upstream 服务器. 这可能很有用, 当一个代理服务器在 nginx 后面, 并配置了接受来自特定 IP 网络或 IP 地址范围的连接.
使用 ngx_stream_proxy_module 模块的 proxy_bind 指令, 其语法:
- Syntax: proxy_bind address [transparent] | off;
- Default: -
- Context: stream, server
- # 此指令在 1.9.2 版本中开始使用.
从指定的本地 IP 地址向被代理服务器发起外部连接. 特殊值 off 取消从上层配置中继承的 proxy_bind 指令产生的影响, 允许系统自动分配本地 IP 地址.
transparent 参数 (1.11.0+) 允许从一个非本地 IP 地址发起到被代理服务器的外部连接, 例如从一个客户端的真实 IP 地址:
proxy_bind $remote_addr transparent;
为了使此参数起作用, 通常需要使用超级用户权限运行 nginx 工作进程. 在 Linux 上, 不需要(1.13.8+), 就像指定了 transparent 参数一样, 工作进程从主进程继承 CAP_NET_RAW 功能. 还需要配置核心路由表以拦截来自被代理服务器的网络流量.
示例配置如下:
- stream {
- # ...
- server {
- listen 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 模块 (默认是编译进来的) 的 upstream 指令. 指令语法:
- Syntax: upstream name {
- ...
- }
- Default: -
- Context: stream
定义一组服务器. 服务器可以侦听不同的端口. 此外, 可以混合侦听 TCP 和 UNIX 域套接字的服务器.
在顶级 stream{}上下文中定义一个或多个 upstream{}配置块, 并设置 upstream 组的名称, 例如 TCP 服务器的 stream_backend 和 UDP 服务器的 dns_servers:
- 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;
- }
- }
配置 upstream 组使用的负载均衡方法. 可以指定以下方法之一:
1.Round Robin: 默认情况下, NGINX 使用循环算法对流进行负载平衡, 将其顺序指向配置的 upstream 组中的服务器. 因为它是默认方法, 所以没有 round-robin 指令; 只需在顶级 stream{}上下文中创建 upstream{}配置块,
2. 最少连接(Least Connections)-nginx 选择当前活动连接数较少的服务器.
- Syntax: least_conn;
- Default: -
- Context: upstream
3. 最少时间 - NGINX Plus 选择平均延迟最低且活动连接数最少的服务器. 用于计算最低平均延迟的方法取决于 least_time 指令中包含以下哪个参数:
- Syntax: least_time connect | first_byte | last_byte [inflight];
- Default: -
- Context: upstream
A. connect - 连接 upstream 服务器的时间
B. first_byte - 接收数据的第一个字节的时间
C. last_byte - 从服务器接收完整响应的时间, 如果指定了 inflight 参数(1.11.6+), 则还会考虑不完整的连接.
4. 哈希 - NGINX 根据用户定义的 key, 选择服务器.
- Syntax: hash key [consistent];
- Default: -
- Context: upstream
Hash 负载平衡方法还用于配置会话持久性. 由于散列函数基于客户端 IP 地址, 因此来自给定客户端的连接始终传递到同一服务器, 除非服务器已关闭或不可用. 指定可选的 consistent 参数以应用 ketama 一致性散列方法:
hash $remote_addr consistent;
5.random - 每个连接将传递给随机选择的服务器. 如果指定了 two 参数, 首先, NGINX 会考虑服务器权重随机选择两台服务器, 然后使用指定的方法选择其中一台服务器:
Syntax: random [two [method]];Default: -Context: upstreamThis directive appeared in version 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 {
- 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;
- }
- }
完整示例
- stream {
- 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;
- }
- server {
- listen 12345;
- proxy_pass stream_backend;
- proxy_buffer_size 16k;
- #proxy_bind 127.0.0.1:12345;
- }
- server {
- listen 53 udp;
- proxy_pass dns_servers;
- proxy_buffer_size 16k;
- }
- }
结束.
[1]: https://docs.nginx.com/nginx/releases/#r5
[2]: https://docs.nginx.com/nginx/releases/#r9
来源: http://server.51cto.com/sOS-597527.htm