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配置文件并执行以下步骤:

  1. 创建一个顶级stream {}块:

    stream { #...
    }
    

  2. server {}在顶级stream {}上下文中为每个虚拟服务器定义一个或多个配置块。

  3. server {}每个服务器的配置块中,包括listen用于定义服务器侦听的IP地址和/或端口的指令。

    对于UDP通信,还包括udp参数。由于TCP是stream上下文的默认协议,因此tcplisten指令没有参数:

    stream {server { listen 12345; #... }server { listen 53  udp; #... } #...
    }
    

  4. 包括该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;} #...
    }
    

  5. 如果代理服务器具有多个网络接口,则可以选择将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; }
    }
    

  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. 创建一组服务器,或一个上游组,其流量将实现负载均衡。upstream {}在顶级stream {}上下文中定义一个或多个配置块,并为上游组(例如,stream_backendTCP服务器和dns_serversUDP服务器)设置名称:

    stream {upstream stream_backend  { #... }upstream dns_servers  { #... }#...
    }
    

    确保上游组的名称由proxy_pass指令引用,就像上面为反向代理配置的指令一样。

  2. 上游服务器填充上游组。在该upstream {}块内,server为每个上游服务器添加一个指令,指定其IP地址或主机名(可以解析为多个IP地址)和一个必需的端口号。请注意,您并未为每个服务器定义协议,因为该协议是由您在前面创建listenserver块中的指令中包含的参数为整个上游组定义的。

    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算法来负载均衡流量,将其顺序​​地定向到已配置的上游组中的服务器。因为它是默认方法,所以没有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
  1. (可选)为每个上游服务器指定服务器特定的参数,包括最大连接数,服务器权重等:

    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轻松地即时重新配置上游服务器组。使用此界面,您可以查看上游组中的所有服务器或特定服务器,修改服务器参数以及添加或删除上游服务器。

要启用即时配置:

  1. 创建顶层http {}块或确保其存在于您的配置中:

    http  { #...
    }
    

  2. 创建配置请求的位置,例如api

    http {server {location /api {# ...}}
    }
    

  3. 在此位置指定api指令:

    http {server {location /api {api;# ...}}
    }

  4. 默认情况下,NGINX Plus API提供对数据的只读访问。该write=on参数启用读/写访问,以便可以对上游进行更改:

    http {server {location /api {api  write=on;# ...}}
    }

  5. 使用allowdeny指令限制对该位置的访问:

    http {server {location /api {api   write=on;allow 127.0.0.1; # permit access from localhostdeny  all;       # deny access from everywhere else}}
    }

  6. 当API在写模式下启用,建议限制访问PATCHPOSTDELETE方法,以特定用户。这可以通过实现: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;}}
    }

  7. 为上游服务器组创建一个共享内存区域,以便所有工作进程都可以使用相同的配置。为此,在顶级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块,每个命名块包含三台服务器,它们承载彼此相同的内容。在serverfor 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负载平衡配置相关推荐

  1. Nginx 配置TCP和UDP负载均衡

    前言 Nginx除了以前常用的HTTP负载均衡外,Nginx增加基于TCP协议实现的负载均衡方法. HTTP负载均衡,也就是我们通常所有"七层负载均衡",工作在第七层"应 ...

  2. 【LVS+Keepalived】 LVS+Keepalived实现tcp、udp负载均衡及HA高可用

    无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家.教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家.点这里可以跳转到教程. LVS 安装 下载 http: ...

  3. .NET开发框架(九)-NLB网络负载平衡配置实战(视频)

    (NLB配置实战教程-有声视频-第二节) 请持续关注公众号,第三节(NLB+ARR)正在录制中~ 第六章IIS负载均衡教程,至今共有37人参与学习 尚未学习第六章-IIS负载均衡-视频教程的童靴, 赶 ...

  4. php开发中大数据量优化的问题总结(1):smarty循环优化、API掉包丢失数据排查、负载平衡配置

    php开发中大数据量优化的问题总结 一.smarty模版引擎遍历优化 1.项目需求 2.解决方案 二.对接第三方API掉包丢失数据 1.丢包和掉包 2.解决和排查 3.配置负载均衡 命令行 宝塔配置 ...

  5. nginx配置 负载均衡_如何配置NGINX负载平衡

    nginx配置 负载均衡 The load balancing is the process of distributing traffic to multiple instances of an a ...

  6. windows网络负载平衡

    网络负载平衡的优点 1.网络负载平衡允许你将传入的请求传播到多台服务器上,即可以使用多台服务器共同分担对外的网络请求服务.网络负载平衡技术保证即使是在负载很重的情况下它们也能作出快速响应. 2.网络负 ...

  7. 巧用Win2003负载平衡服务实现LCS2005企业版的部署:LCS2005系列之五

    巧用Win2003负载平衡解决LCS2005企业版部署 在前面的博文中我们介绍了一些LCS2005标准版的部署和使用,今天我们来实现LCS2005企业版的部署.LCS企业版比标准版复杂得多,由于LCS ...

  8. Windows服务器——网络负载平衡

    网络负载平衡 文章目录 网络负载平衡 配置过程 1.准备安装账户 2.新建群集 3.添加节点到群集 4.验证网络负载平衡 配置过程 1.准备安装账户 若要安装和配置NLB,必须使用每个主机上Admin ...

  9. Nginx stream 配置代理(Nginx TCP/UDP 负载均衡)

    前奏 我们都知道 nginx 是一款优秀的反向代理服务,用过 nginx 的也应该都知道 upstream,upstream 节点一般置于 http 节点大括号中,常规在 upstream 中配置需要 ...

最新文章

  1. idea控制台怎么调出来_酸汤饺子最近火了,可是酸汤是怎么调出来的?引起了网友的好奇...
  2. 项目上线,php的错误信息必须不让其在页面中显示给客户,
  3. 基于Xml 的IOC 容器-载入<list>的子元素
  4. python朋友圈评论_利用Python实现朋友圈中的九宫格图片效果
  5. JSF2.0与纯JS框架
  6. JavaScript入门第一天,js教程,js变量, 数据类型,数据转换,隐式转换
  7. 软件工程--第一周学习进度
  8. ssh(struts,spring,hibernate)开发的初步集成01--依赖
  9. Qone 自动删除说说脚本
  10. zynq文档阅读之EMIO和MIO的细微差别
  11. 伟大架构师的秘密(转载)
  12. java接口中有效的方法声明_在Java接口中,下列选顶中有效的方法声明是
  13. apollo local 模式_Apollo开发者说丨使用GDB调试Apollo项目
  14. 我对javascript面向对象编程的理解---------继承
  15. KITTI数据集解读
  16. 华为鸿蒙系统支持5g吗,华为新机入网:预装鸿蒙OS 不支持5G网络
  17. matlab实现将彩色图像转换成灰色图像的方法
  18. 服务器部署dble全流程
  19. 计算机网络职业生涯规划书模板前言,计算机网络技术专业个人职业生涯规划书(参考模板).doc...
  20. MySQL学习---作业(1)

热门文章

  1. MongoDB 教程番外篇之管理工具: Rockmongo
  2. 搞定网页打印自动分页问题
  3. 对PHP输入输出流学习和认识
  4. Objective-C 2.0 with Cocoa Foundation --- 3,类的声明和定义
  5. nginx配置url重写
  6. varnish 高性能方向代理服务器
  7. 机器学习速成课程 | 练习 | Google Development——编程练习:验证
  8. 集合的体系结构 0119
  9. 草稿 修改数据 datagroupview
  10. 学习编程的方法与建议