【官方文档】Nginx负载均衡学习笔记(三) TCP和UDP负载平衡官方参考文档
本章介绍如何使用NGINX Plus和NGINX开放源代理和负载平衡TCP和UDP流量。
目录
介绍
负载平衡是指跨多个后端服务器有效分布网络流量。
在版本5和更高版本中,NGINX可以代理和负载平衡TCP流量。TCP(传输控制协议)是用于许多流行的应用和服务的协议,例如LDAP,MySQL和RTMP。
在版本9和更高版本中,NGINX可以代理和负载平衡UDP流量。UDP(用户数据报协议)是许多流行的非事务性应用程序的协议,例如DNS,syslog和RADIUS。
要加载平衡HTTP流量,请参阅HTTP负载平衡一文。
先决条件
- 最新的
--with-stream
NGINX 开源采用配置标志或最新的NGINX Plus构建(无需额外的构建步骤) - 通过TCP或UDP进行通信的应用程序,数据库或服务
- 上游服务器,每个服务器运行应用程序,数据库或服务的同一实例
配置反向代理
首先,您需要配置反向代理,以便NGINX 可以将客户端的TCP连接或UDP数据报转发到上游组或代理服务器。
打开NGINX配置文件并执行以下步骤:
1、创建顶级stream {}
块:
- stream {
- ...
- }
2、server {}在顶层stream {}上下文中为每个虚拟服务器 定义一个或多个配置块。
3、在server {}每个服务器的配置块中,包括listen用于定义服务器侦听的IP地址和/或端口的指令。对于UDP流量,还包括udp参数。TCP是stream上下文的默认协议,因此没有tcp
参数listen指令:
- stream {
- server {
- listen ;
- ...
- }
- server {
- listen udp;
- ...
- }
- ...
- }
4、包括proxy_pass
用于定义代理服务器的指令或服务器转发流量的上游组:
- stream {
- server {
- listen ;
- #TCP traffic will be proxied to the "stream_backend" upstream group
- proxy_pass stream_backend;
- }
- server {
- listen ;
- #TCP traffic will be proxied a proxied server
- proxy_pass backend.example.com:;
- }
- server {
- listen udp;
- #UDP traffic will be proxied to the "dns_servers" upstream group
- proxy_pass dns_servers;
- }
- ...
- }
5、或者,如果您的代理服务器有多个网络接口,您可以配置NGINX选择一个源IP地址连接到上游服务器。如果NGINX后面的代理服务器配置为接受来自特定IP网络或IP地址范围的连接,这可能很有用。
指定proxy_bind必需的网络接口的伪指令和IP地址:
- stream {
- ...
- server {
- listen 127.0.0.1:;
- proxy_pass backend.example.com:;
- proxy_bind 127.0.0.1:;
- }
- }
6、或者,您可以调整两个内存缓冲区的大小,其中NGINX可以从客户端和上游连接中输入数据。如果存在小量的数据,则可以减少缓冲器,这可以节省存储器资源。如果存在大量数据,则可以增加缓冲区大小以减少套接字读/写操作的数量。一旦在一个连接上接收到数据,NGINX读取它并通过另一个连接转发它。缓冲区由指令proxy_buffer_size控制:
- stream {
- ...
- server {
- listen 127.0.0.1:;
- proxy_pass backend.example.com:;
- proxy_buffer_size 16k;
- }
- }
配置TCP或UDP负载平衡
1、创建一组服务器,或流量将负载平衡的上游组。upstream {}
在顶层stream {}
上下文中定义一个或多个配置块,并为上游组设置名称,例如,stream_backend
对于TCP服务器和dns_servers
UDP服务器:
- stream {
- upstream stream_backend {
- ...
- }
- upstream dns_servers {
- ...
- }
- ...
- }
注意:确保上一个配置中proxy_pass
引用了上游组的名称。
2、使用上游服务器填充上游组。在upstream {}
块中,server
为每个上游服务器添加一个伪指令,指定其IP地址或主机名(可解析为多个IP地址)和必需的端口号。请注意,您不为每个服务器定义协议,因为它是由您在前面创建listen
的server
块中的伪指令中包含的参数为整个上游组定义的。
- stream {
- upstream stream_backend {
- server backend1.example.com:;
- server backend2.example.com:;
- server backend3.example.com:;
- ...
- }
- upstream dns_servers {
- server 192.168.136.130:;
- server 192.168.136.131:;
- ...
- }
- ...
- }
配置上游组使用的负载分担方法。您可以指定以下方法之一:
round-robin
- 默认情况下,NGINX使用循环算法对流量进行负载均衡,将其顺序定向到配置的上游组中的服务器。因为它是默认方法,没有round-robin
指令; 只需upstream
在顶层stream
上下文中创建一个配置块并添加上server
一步中描述的指令。least_conn
- NGINX选择当前活动连接数较少的服务器。least_time
- NGINX选择平均延迟最小,活动连接数最少的服务器。最低平均延迟是基于以下参数中的哪一个包括在least_time
指令上计算的:connect
- 连接到上游服务器的时间first_byte
- 接收数据的第一个字节的时间last_byte
- 从服务器接收完整响应的时间- upstream stream_backend {
- least_time first_byte;
- server backend1.example.com:;
- server backend2.example.com:;
- server backend3.example.com:;
- }
- upstream stream_backend {
hash
- NGINX基于用户定义的密钥选择服务器,例如源IP地址($remote_addr
):
- upstream stream_backend {
- hash $remote_addr;
- server backend1.example.com:;
- server backend2.example.com:;
- server backend3.example.com:;
- }
所述散列负载平衡方法还用于配置会话持久性。由于散列函数基于客户端IP地址,来自给定客户端的连接始终传递到同一服务器,除非服务器关闭或以其他方式不可用。指定一个可选consistent
参数以应用ketama一致性散列方法:
- hash $remote_addr consistent;
或者,对于每个上游服务器,指定服务器特定的参数,包括最大连接数,服务器权重等:
- upstream stream_backend {
- hash $remote_addr consistent;
- server backend1.example.com: weight=;
- server backend2.example.com:;
- server backend3.example.com: max_conns=;
- }
- upstream dns_servers {
- least_conn;
- server 192.168.136.130:;
- server 192.168.136.131:;
- ...
- }
另一种方法是将流量代理到单个服务器而不是上游组。如果您通过主机名标识服务器,并将主机名配置为解析为多个IP地址,则NGINX使用循环算法在IP地址之间对流量进行负载平衡。在这种情况下,必须在配置参数中指定服务器的端口号,proxy_pass
并且不能在IP地址或主机名之前指定协议:
- stream {
- ...
- server {
- listen ;
- proxy_pass backend.example.com:;
- }
- }
被动健康监控
如果尝试连接到上游服务器超时或导致错误,NGINX开源或NGINX Plus可以将服务器标记为不可用,并停止向其发送请求一段确定的时间。要定义NGINX认为上游服务器不可用的条件,请在指令中包含以下server
参数
fail_timeout
- 指定数量的连接尝试必须失败,服务器被认为不可用的时间量。此外,在标记它之后,NGINX认为服务器不可用的时间量。max_fails
- 在指定时间内发生的NGINX认为服务器不可用的失败尝试次数。
默认值为10
秒和1
尝试。因此,如果连接尝试在10秒内超时或至少出现一次失败,则NGINX将服务器标记为不可用10秒。该示例显示如何在30秒内将这些参数设置为2个故障:
- upstream stream_backend {
- server backend1.example.com: weight=;
- server backend2.example.com: max_fails= fail_timeout=30s;
- server backend3.example.com: max_conns=;
- }
主动健康监控
可以配置运行状况检查以测试各种故障类型。例如,NGINX Plus可以连续测试上游服务器的响应能力,避免出现故障的服务器。
怎么运行的
NGINX Plus向每个上游服务器发送特殊的健康检查请求,并检查满足特定条件的响应。如果无法建立与服务器的连接,则健康检查将失败,并认为服务器不正常。NGINX Plus不会将客户端连接代理到不正常的服务器。如果为一组服务器定义了几个运行状况检查,则任何一个检查的失败都足以使相应的服务器被视为不正常运行。
先决条件
- 您已在
stream
上下文中配置了上游服务器组,例如:
- stream {
- upstream stream_backend {
- server backend1.example.com:;
- server backend2.example.com:;
- server backend3.example.com:;
- }
- }
- 您已配置将流量(在这种情况下为TCP连接)传递到服务器组的服务器:
- server {
- listen ;
- proxy_pass stream_backend;
- }
基本配置
- 指定共享内存区域 - 一个特殊区域,NGINX Plus工作进程共享关于计数器和连接的状态信息。将
zone
指令添加到上游服务器组,并指定区域名称和内存量:
- stream {
- upstream stream_backend {
- zone stream_backend 64k;
- server backend1.example.com:;
- server backend2.example.com:;
- server backend3.example.com:;
- }
- }
对上游组中的服务器启用运行状况检查。将health_check
和health_check_timeout
指令添加到代理到上游组的连接的服务器:
- server {
- listen ;
- proxy_pass stream_backend;
- health_check;
- health_check_timeout 5s;
- }
该health_check
指令启用运行状况检查功能,同时health_check_timeout
覆盖proxy_timeout
运行状况检查的值,对于运行状况检查,此超时需要显着缩短。
要对UDP流量启用运行状况检查,在health_check
指令中指定udp
启用UDP的运行状况检查的参数,以及包含用于验证服务器响应的测试match=
的相应match
块的名称的参数(请参阅微调UDP运行状况检查):
- server {
- listen ;
- proxy_pass dns_servers;
- health_check udp match=dns;
- health_check_timeout 5s;
- }
微调健康检查
默认情况下,NGINX Plus每5秒尝试连接一个上游服务器组中的每个服务器。如果无法建立连接,NGINX Plus认为健康检查失败,将服务器标记为不正常,并停止将客户端连接转发到服务器。
要更改默认行为,请在参数中包含health_check
参数:
interval
- NGINX Plus发送健康检查请求的频率(以秒为单位)(默认为5秒)passes
- 服务器必须响应以认为健康的连续运行状况检查的数量(默认值为1)fails
- 服务器必须无法响应以认为不正常的连续运行状况检查数(默认值为1)- server {
- listen ;
- proxy_pass stream_backend;
- health_check interval= passes= fails=;
- }
- server {
在该示例中,TCP运行状况检查之间的时间增加到10
秒,服务器在3
连续失败的运行状况检查后被认为不健康,并且服务器需要通过2
连续检查以再次被视为健康。
默认情况下,NGINX Plus会向块中server
指令指定的端口发送运行状况检查消息upstream
。您可以指定另一个端口进行运行状况检查,这在监视同一主机上许多服务的运行状况时尤其有用。要覆盖端口,请指定port
指令的health_check
参数:
- server {
- listen ;
- proxy_pass stream_backend;
- health_check port=;
- }
- uptream name {
- server 192.168.0.21:;
- server 192.168.0.22:;
- check interval= rise= fall= timeout= type=http;
- }
- #上面配置的意思是,对name这个负载均衡条目中的所有节点,每个3秒检测一资,请求2资下正常则标记realserver状态为up,如果检测5次都失败,则标记realserver的状态为down,超时间为1秒。
【官方文档】Nginx负载均衡学习笔记(三) TCP和UDP负载平衡官方参考文档的更多相关文章
- 【官方文档】Nginx负载均衡学习笔记(二)负载均衡基本概念介绍
简介 负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台 ECS 的流量分发控制服务.负载均衡可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应 ...
- Web负载均衡学习笔记之实现负载均衡的几种实现方式
0x00 概要 负载均衡(Load Balance)是集群技术(Cluster)的一种应用.负载均衡可以将工作任务分摊到多个处理单元,从而提高并发处理能力.目前最常见的负载均衡应用是Web负载均衡.根 ...
- Web负载均衡学习笔记之四层和七层负载均衡的区别
0x00 简介 简单理解四层和七层负载均衡: ① 所谓四层就是基于IP+端口的负载均衡:七层就是基于URL等应用层信息的负载均衡:同理,还有基于MAC地址的二层负载均衡和基于IP地址的三层负载均衡. ...
- nginx官方文档 之 http负载均衡 学习笔记
一.负载均衡 算法 大致可以分两类: (1)不能保证用户的每一次请求都通过负载均衡到达同一服务器. (2)可保证用户的每一次请求都通过负载均衡到达同一服务器. 第二类的应用场景: 1.如果服务器有缓存 ...
- 【精选】Nginx负载均衡学习笔记(一)实现HTTP负载均衡和TCP负载均衡(官方和OpenResty两种负载配置)
说明:很简单一个在HTTP模块中,而另外一个和HTTP 是并列的Stream模块(Nginx 1.9.0 支持) 一.两个模块的最简单配置如下 1.HTTP负载均衡: http { include m ...
- Web负载均衡学习笔记之K8S内Ngnix微服务服务超时问题
0x00 概述 本文是从K8S内微服务的角度讨论Nginx超时的问题 0x01 问题 在K8S内部署微服务后,发现部分微服务链接超时,Connection Time Out. 最近碰到了一个 Ngin ...
- centos之Haproxy 负载均衡学习笔记
HAProxy的特点是:1.支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机:2.能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作3.支持url检测后端的 ...
- spring cloud学习笔记三 Feign与Ribbon负载均衡的区别
一.Feign的介绍 Feign一般比较书面的解释是:Feign是一个声明式的WebService客户端,使用Feign编写的WebService客户端更加简单,他的使用方法是定义一个接口,然后在上线 ...
- 转载Spring Data JPA 指南——整理自官方参考文档
转载:https://blog.csdn.net/u014633852/article/details/52607346 官方文档 https://docs.spring.io/spring-data ...
随机推荐
- 【转】python 三种遍历list的方法
[转]python 三种遍历list的方法 #!/usr/bin/env python # -*- coding: utf-8 -*- if __name__ == '__main__': list ...
- ns-3 可视化模拟 (一) PyViz
PyViz 个人觉得这个的使用简单. (1)首先安装 这是ubuntu下的 sudo apt-get install python-dev python-pygraphviz python-kiwi ...
- IDE调研之二
Eclipse和Jetbrains的IntelliJ IDEA对比: Eclipse工具 在Eclipse中,可以最大化控制台.通过双击标签或者Ctrl+M快捷键就可以实现,但是在IntelliJ I ...
- [BUAA2017软工]个人作业week-1
一.快速看完整部教材,列出你仍然不懂的5到10个问题,发布在你的个人博客上. 1.在第二章个人技术和流程,邹欣老师提到了一张表格,主要解释了效能分析的一些名词,其中有这么几个概念: 调用者:函数Foo ...
- Win2019 IPV6 支持存在问题
1. 昨天晚上尝试 使用IPV6进行Oracle与SQLserver 的链接测试.从晚上六点到晚上八点测试环境一直不通. 后来换了服务器之后发现立即就可以了. 经过简单确认 怀疑Win server ...
- 一次DHCP故障排错
关于DHCP授权,我一直遇到这样一个问题:服务器明明已经在授权列表中了,但是服务就是起不来,看日志会告诉你服务器未授权或者局域网内已有DHCP服务器,但是实际上却并不是这样.现在终于知道原因了,老旧D ...
- docker-py安装
linux: pip install docker-py
- Class.getResourceAsStream 和 ClassLoder.getResourceAsStream 的区别
问题描述 最近学习MyBaits时用到了 InputStream Resources.getResourceAsStream(String resource)来读取MyBatis配置文件,为了方便使用 ...
- C 函数——Day04
C 函数 函数是一组一起执行一个任务的语句.每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数. 您可以把代码划分到不同的函数中.如何划分代码到不同的函数 ...
- 51nod 1785 数据流中的算法 | STL的应用
51nod 1785 数据流中的算法 题面 动态求平均数.方差.中位数. 题解 这道题的坑: 平均数在答案中是向下取整输出并在后面添加".00" 方差:平方的平均数减去平均数的平方 ...