Ngnix的TCP和UDP负载平衡配置
Ngnix的TCP和UDP负载平衡配置
本章介绍如何使用NGINX Plus和NGINX开源来代理和负载均衡TCP和UDP流量。
- 介绍
- 先决条件
- 配置反向代理
- 配置TCP或UDP负载平衡
- 配置健康检查
- 即时配置
- 即时配置示例
- TCP和UDP负载平衡配置示例
介绍
负载平衡是指在多个后端服务器之间有效地分配网络流量。
在NGINX Plus 版本5和更高版本中,NGINX Plus可以代理和负载平衡传输控制协议(TCP)通信。TCP是许多流行的应用程序和服务(例如LDAP,MySQL和RTMP)的协议。
在NGINX Plus 版本9和更高版本中,NGINX Plus可以代理和负载平衡UDP流量。UDP(用户数据报协议)是许多流行的非事务性应用程序的协议,例如DNS,syslog和RADIUS。
要负载均衡HTTP流量,请参阅HTTP负载均衡文章。
先决条件
- 最新的NGINX Plus(无需额外的构建步骤)或最新的NGINX Open Source(带有
--with-stream
配置标志) - 通过TCP或UDP进行通信的应用程序,数据库或服务
- 上游服务器,每个服务器运行相同的应用程序,数据库或服务实例
配置反向代理
首先,您将需要配置反向代理,以便NGINX Plus或NGINX开源可以将TCP连接或UDP数据报从客户端转发到上游组或代理服务器。
打开NGINX配置文件并执行以下步骤:
创建一个顶级
stream
{}
块:stream { #... }
server
{}
在顶级stream
{}
上下文中为每个虚拟服务器定义一个或多个配置块。在
server
{}
每个服务器的配置块中,包括listen
用于定义服务器侦听的IP地址和/或端口的指令。对于UDP通信,还包括
udp
参数。由于TCP是stream
上下文的默认协议,因此tcp
该listen
指令没有参数:stream {server { listen 12345; #... }server { listen 53 udp; #... } #... }
包括该
proxy_pass
指令以定义代理服务器或服务器将流量转发到的上游组:stream {server { listen 12345; #TCP流量将转发到“ stream_backend”上游组proxy_pass stream_backend;}server { listen 12346; #TCP流量将被转发到指定的服务器proxy_pass backend.example.com:12346;}server { listen 53 udp; #UDP通信将被转发到“ dns_servers”上游组proxy_pass dns_servers;} #... }
如果代理服务器具有多个网络接口,则可以选择将NGINX配置为在连接到上游服务器时使用特定的源IP地址。如果将NGINX之后的代理服务器配置为接受来自特定IP网络或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; } }
(可选)您可以调整两个内存缓冲区的大小,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负载平衡
要配置负载平衡:
创建一组服务器,或一个上游组,其流量将实现负载均衡。
upstream
{}
在顶级stream
{}
上下文中定义一个或多个配置块,并为上游组(例如,stream_backend
TCP服务器和dns_servers
UDP服务器)设置名称:stream {upstream stream_backend { #... }upstream dns_servers { #... }#... }
确保上游组的名称由
proxy_pass
指令引用,就像上面为反向代理配置的指令一样。用上游服务器填充上游组。在该
upstream
{}
块内,server
为每个上游服务器添加一个指令,指定其IP地址或主机名(可以解析为多个IP地址)和一个必需的端口号。请注意,您并未为每个服务器定义协议,因为该协议是由您在前面创建listen
的server
块中的指令中包含的参数为整个上游组定义的。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 ; #... }#... }
配置上游组使用的负载均衡方法。您可以指定以下方法之一:
的随机负载平衡方法应被用于在多个负载平衡器传递请求到相同组的后端分布式环境。对于负载平衡器具有所有请求的完整视图的环境,请使用其他负载平衡方法,例如轮询,最少连接和最少时间。
- Round Robin –默认情况下,NGINX使用Round Robin算法来负载均衡流量,将其顺序地定向到已配置的上游组中的服务器。因为它是默认方法,所以没有
round‑robin
指令。只需在顶级上下文中创建配置块并添加上一步中所述的指令即可。upstream {}
stream {}
server
- 最少的连接 – NGINX选择当前活动连接数量较少的服务器。
- 最短时间(仅适用于NGINX Plus)– NGINX Plus选择具有最低平均延迟和最少活动连接数的服务器。用于计算最低平均等待时间的方法取决于
least_time
指令中包含以下哪些参数:
connect
–连接上游服务器的时间first_byte
–接收数据的第一个字节的时间last_byte
–是时候从服务器接收完整响应了
哈希 – NGINX根据用户定义的密钥(例如,源IP地址($remote_addr
))选择服务器:
随机 –每个连接都将传递到随机选择的服务器。如果two
指定了参数,首先,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;
}
least_conn
–活动连接最少least_time=connect
(NGINX Plus)–连接上游服务器的时间($upstream_connect_time
)least_time=first_byte
(NGINX Plus)–从服务器接收数据的第一个字节的最短平均时间($upstream_first_byte_time
)least_time=last_byte
(NGINX Plus)–从服务器接收数据最后一个字节的最短平均时间($upstream_session_time
)
(可选)为每个上游服务器指定服务器特定的参数,包括最大连接数,服务器权重等:
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;# ... }
另一种方法是将流量代理到单个服务器而不是上游组。如果您通过主机名标识服务器,并配置主机名以解析为多个IP地址,则NGINX使用该Round Robin
算法对IP地址之间的流量进行负载平衡。在这种情况下,您必须在proxy_pass
指令中指定服务器的端口号,并且不得在IP地址或主机名之前指定协议:
stream {# ...server {listen 12345;proxy_pass backend.example.com:12345;}
}
配置健康检查
NGINX可以持续测试您的TCP或UDP上游服务器,避免出现故障的服务器,并将恢复的服务器正常地添加到负载均衡组中。
有关如何配置TCP的运行状况检查的说明,请参阅TCP运行状况检查。
有关如何为UDP配置运行状况检查的说明,请参阅UDP运行状况检查。
即时配置
可以使用NGINX Plus REST API轻松地即时重新配置上游服务器组。使用此界面,您可以查看上游组中的所有服务器或特定服务器,修改服务器参数以及添加或删除上游服务器。
要启用即时配置:
创建顶层
http
{}
块或确保其存在于您的配置中:http { #... }
创建配置请求的位置,例如api:
http {server {location /api {# ...}} }
在此位置指定
api
指令:http {server {location /api {api;# ...}} }
默认情况下,NGINX Plus API提供对数据的只读访问。该
write=on
参数启用读/写访问,以便可以对上游进行更改:http {server {location /api {api write=on;# ...}} }
使用
allow
和deny
指令限制对该位置的访问:http {server {location /api {api write=on;allow 127.0.0.1; # permit access from localhostdeny all; # deny access from everywhere else}} }
当API在写模式下启用,建议限制访问
PATCH
,POST
和DELETE
方法,以特定用户。这可以通过实现:HTTP basic authentication
http {server {location /api {limit_except GET {auth_basic "NGINX Plus API";auth_basic_user_file /path/to/passwd/file;}api write=on;allow 127.0.0.1;deny all;}} }
为上游服务器组创建一个共享内存区域,以便所有工作进程都可以使用相同的配置。为此,在顶级
stream
{}
块中,找到目标upsteam组,将zone
指令添加到上游服务器组中,并指定区域名称(此处为stream_backend)和内存量(64 KB):stream {upstream stream_backend {zone backend 64k;# ...} }
即时配置示例
stream {# ...# Configuration of an upstream server groupupstream appservers {zone appservers 64k;server appserv1.example.com:12345 weight=5;server appserv2.example.com:12345 fail_timeout=5s;server backup1.example.com:12345 backup;server backup2.example.com:12345 backup;}server {# Server that proxies connections to the upstream groupproxy_pass appservers;health_check;}
}
http {# ...server {# Location for API requestslocation /api {limit_except GET {auth_basic "NGINX Plus API";auth_basic_user_file /path/to/passwd/file;}api write=on;allow 127.0.0.1;deny all;}}
}
在这里,仅允许从本地主机地址(127.0.0.1
)访问该位置。来自所有其他IP地址的访问被拒绝。
要将配置命令传递给NGINX,请通过任何方法(例如,使用curl)发送API命令。
例如,要将新服务器添加到服务器组,请发送POST
请求:
curl -X POST -d '{ \ "server": "appserv3.example.com:12345", \ "weight": 4 \ }' -s 'http://127.0.0.1/api/5/stream/upstreams/appservers/servers'
要从服务器组中删除服务器,请发送DELETE
请求:
curl -X DELETE -s'http://127.0.0.1/api/5/stream/upstreams/appservers/servers/0'
要修改特定服务器的参数,请发送 PATCH
请求:
curl -X PATCH -d'{“ down”:true}'-s'http://127.0.0.1/api/5/http/upstreams/appservers/servers/0'
TCP和UDP负载平衡配置示例
这是使用NGINX进行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代理相关的功能都在stream
块内进行配置,就像在http
块中配置了HTTP请求的设置一样。
有两个命名upstream
块,每个命名块包含三台服务器,它们承载彼此相同的内容。在server
for eadch服务器中,服务器名称后跟必需的端口号。根据最小连接负载平衡方法,连接在服务器之间分配:连接到活动连接最少的服务器。
这三个server
块定义了三个虚拟服务器:
第一台服务器侦听端口12345,并将所有TCP连接代理到上游服务器的stream_backend组。请注意,在模块
proxy_pass
上下文中定义的指令stream
不得包含协议。指定了两个可选的超时参数:
proxy_connect_timeout
伪指令设置与stream_backend组中的服务器建立连接所需的超时。该proxy_timeout
指令设置在代理到stream_backend组中的一台服务器已启动之后使用的超时。第二台服务器侦听端口53,并将所有UDP数据报(指令的
udp
参数listen
)代理到称为dns_servers的上游组。如果udp
未指定该参数,则套接字监听TCP连接。第三个虚拟服务器侦听端口12346,并代理到backend4.example.com的 TCP连接,后者可以解析为使用Round Robin方法实现负载平衡的多个IP地址。
Ngnix的TCP和UDP负载平衡配置相关推荐
- Nginx 配置TCP和UDP负载均衡
前言 Nginx除了以前常用的HTTP负载均衡外,Nginx增加基于TCP协议实现的负载均衡方法. HTTP负载均衡,也就是我们通常所有"七层负载均衡",工作在第七层"应 ...
- 【LVS+Keepalived】 LVS+Keepalived实现tcp、udp负载均衡及HA高可用
无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家.教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家.点这里可以跳转到教程. LVS 安装 下载 http: ...
- .NET开发框架(九)-NLB网络负载平衡配置实战(视频)
(NLB配置实战教程-有声视频-第二节) 请持续关注公众号,第三节(NLB+ARR)正在录制中~ 第六章IIS负载均衡教程,至今共有37人参与学习 尚未学习第六章-IIS负载均衡-视频教程的童靴, 赶 ...
- php开发中大数据量优化的问题总结(1):smarty循环优化、API掉包丢失数据排查、负载平衡配置
php开发中大数据量优化的问题总结 一.smarty模版引擎遍历优化 1.项目需求 2.解决方案 二.对接第三方API掉包丢失数据 1.丢包和掉包 2.解决和排查 3.配置负载均衡 命令行 宝塔配置 ...
- nginx配置 负载均衡_如何配置NGINX负载平衡
nginx配置 负载均衡 The load balancing is the process of distributing traffic to multiple instances of an a ...
- windows网络负载平衡
网络负载平衡的优点 1.网络负载平衡允许你将传入的请求传播到多台服务器上,即可以使用多台服务器共同分担对外的网络请求服务.网络负载平衡技术保证即使是在负载很重的情况下它们也能作出快速响应. 2.网络负 ...
- 巧用Win2003负载平衡服务实现LCS2005企业版的部署:LCS2005系列之五
巧用Win2003负载平衡解决LCS2005企业版部署 在前面的博文中我们介绍了一些LCS2005标准版的部署和使用,今天我们来实现LCS2005企业版的部署.LCS企业版比标准版复杂得多,由于LCS ...
- Windows服务器——网络负载平衡
网络负载平衡 文章目录 网络负载平衡 配置过程 1.准备安装账户 2.新建群集 3.添加节点到群集 4.验证网络负载平衡 配置过程 1.准备安装账户 若要安装和配置NLB,必须使用每个主机上Admin ...
- Nginx stream 配置代理(Nginx TCP/UDP 负载均衡)
前奏 我们都知道 nginx 是一款优秀的反向代理服务,用过 nginx 的也应该都知道 upstream,upstream 节点一般置于 http 节点大括号中,常规在 upstream 中配置需要 ...
最新文章
- idea控制台怎么调出来_酸汤饺子最近火了,可是酸汤是怎么调出来的?引起了网友的好奇...
- 项目上线,php的错误信息必须不让其在页面中显示给客户,
- 基于Xml 的IOC 容器-载入<list>的子元素
- python朋友圈评论_利用Python实现朋友圈中的九宫格图片效果
- JSF2.0与纯JS框架
- JavaScript入门第一天,js教程,js变量, 数据类型,数据转换,隐式转换
- 软件工程--第一周学习进度
- ssh(struts,spring,hibernate)开发的初步集成01--依赖
- Qone 自动删除说说脚本
- zynq文档阅读之EMIO和MIO的细微差别
- 伟大架构师的秘密(转载)
- java接口中有效的方法声明_在Java接口中,下列选顶中有效的方法声明是
- apollo local 模式_Apollo开发者说丨使用GDB调试Apollo项目
- 我对javascript面向对象编程的理解---------继承
- KITTI数据集解读
- 华为鸿蒙系统支持5g吗,华为新机入网:预装鸿蒙OS 不支持5G网络
- matlab实现将彩色图像转换成灰色图像的方法
- 服务器部署dble全流程
- 计算机网络职业生涯规划书模板前言,计算机网络技术专业个人职业生涯规划书(参考模板).doc...
- MySQL学习---作业(1)