我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Nginx如何限流

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Nginx如何限流

这篇文章主要介绍了Nginx如何限流,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

1   漏桶和令牌桶算法的概念

漏桶算法(Leaky Bucket):主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。漏桶算法的示意图如下图所示,请求先进入到漏桶里,漏桶以一定的速度出水,当水请求过大会直接溢出,可以看出漏桶算法能强行限制数据的传输速率。

Nginx如何限流

令牌桶算法(Token Bucket):是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。令牌桶算法示意图如下图所示,大小固定的令牌桶可自行以恒定的速率源源不断地产生令牌。如果令牌不被消耗,或者被消耗的速度小于产生的速度,令牌就会不断地增多,直到把桶填满。后面再产生的令牌就会从桶中溢出。最后桶中可以保存的最大令牌数永远不会超过桶的大小。

Nginx如何限流

2   两种算法的区别

两者主要区别在于“漏桶算法”能够强行限制数据的传输速率,而“令牌桶算法”在能够限制数据的平均传输速率外,还允许某种程度的突发传输。在“令牌桶算法”中,只要令牌桶中存在令牌,那么就允许突发地传输数据直到达到用户配置的门限,所以它适合于具有突发特性的流量。

3  按请求速率限速

按请求速率限速是指限制IP发送请求的速率,超出指定速率后,Nginx将直接拒绝更多的请求。采用漏桶算法实现。下面从一些实验数据上来深入的了解这个模块,先简单介绍一下该模块的配置方式,如下图所示(配置需要在Nginx配置和域名配置里面同时修改),使用limit_req_zone关键字,定义一个名为tip大小为10MB的共享内存区域(zone),用来存放限速相关的统计信息,限速的key值为二进制的IP地址($binary_remote_addr),限速上限(rate)为2r/s。

将上述规则应用到/search目录(单个IP的访问速度被限制在了2请求/秒,超过这个限制的访问将直接被Nginx拒绝)。burst和nodelay的作用稍后解释。(zone=tip:10m表示会话空间的存储大小为10m)。

Nginx如何限流

4   3个实验案例

实验1、讨论2个请求在1s内的执行过程

修改配置下图所示:

Nginx如何限流

我们使用ab工具模拟1s发送2个请求。

Nginx如何限流

只有一个请求成功了,查看了一下执行时间:

Nginx如何限流

1ms内完成了所有请求,考虑到每秒两个请求可能是分时间段来来完成的,二分法做了大量延迟处理的尝试,当两个请求之间的时延大于0.5s时第二个请求才会成功。

Nginx如何限流

结论:Nginx的限流统计是基于毫秒的,我们设置的速度是2r/s,转换一下就是500ms内单个IP只允许通过1个请求,从501ms开始才允许通过第二个请求。

Nginx如何限流

实验2、burst允许缓存处理突发请求

如果短时间内发送了大量请求,Nginx按照毫秒级精度统计,超出限制的请求直接拒绝。这在实际场景中未免过于苛刻,真实网络环境中请求到来不是匀速的,很可能有请求“突发”的情况。Nginx考虑到了这种情况,可以通过burst关键字开启对突发请求的缓存处理,而不是直接拒绝。(类似令牌桶算法)

修改Nginx配置如下:

Nginx如何限流

我们加入了burst=4,意思是每个key(此处是每个IP)最多允许4个突发请求的到来。使用ab工具发送6个请求,结果会怎样呢?

Nginx如何限流

发送时间:

Nginx如何限流

执行结果是请求全部被处理,加入缓冲队列后,按照之前时间轴的规则 ,在0.001s、0.501s、1.001s、1.501s、2.001s、2.501s分别发送一个请求,与之前的有些偏差,理论上数据应该是同时发送到ngnix,我们做了抓包统进行验证,可以观察到6个请求分别开辟了6个端口进行发送,只有当第一个包三次握手完成,第二个包才开始发送,时间间隔500ms,这就验证了ab工具确实是单个发送的。

Nginx如何限流

另外,理论上缓冲区之外的2个请求应该只有一个是200,另外一个是503,缓冲区的4个请求是按照2r/s的速度依次处理,这里是由于ab工具本身的问题,在加入缓冲队列后,发送时间由之前的1ms内完成变成了2501ms完成,所以导致了请求都被处理掉,若是使用其他工具短时间内发送6个请求,则只能成功5个。

Nginx如何限流

发送耗时2ms,完成处理时间2437ms,每个请求的处理时间。

Nginx如何限流

由于ngnix 500ms处理完第一个请求后,501ms才会处理第二个请求,所以5个请求(去掉503那个)耗时500ms*4+416ms=2416ms(本地实测,不同Nginx性能有所差异),或者使用ab工具并发来处理这些请求,也会有同样的效果。

Nginx如何限流

我们再来观察一下发送时间,所有的请求基本在10ms内发起,这样便导致了6个请求中,去掉第一个和缓冲区的4个,第二个被拒绝掉。

Nginx如何限流

实验3、nodelay降低排队时间

通过设置burst参数,我们可以允许Nginx缓存处理一定程度的突发,多余的请求可以先放到队列里,慢慢处理,这起到了平滑流量的作用。但是如果队列设置的比较大,请求排队的时间就会比较长,这对用户很不友好。nodelay参数允许请求在排队的时候就立即被处理,也就是说只要请求能够进入burst队列,就会立即被后台worker处理。

延续实验2的配置,我们加入nodelay选项:

Nginx如何限流

同样发送6个请求发送时间:

Nginx如何限流

实验结果如下图所示:

Nginx如何限流

处理时间:

Nginx如何限流

与实验2相比直观上的效果就是Nginx同时出现6条日志,即6个请求是同时被处理的,而实验2日志是逐条生成的,间隔0.5s,视觉上有卡顿。

虽然设置burst和nodelay能够降低突发请求的处理时间,但是长期来看并不会提高吞吐量的上限,长期吞吐量的上限是由rate决定的,因为nodelay只能保证burst的请求被立即处理,加入了nodelay参数之后的限速算法还算是漏桶算法,当令牌桶算法的token为耗尽时,由于它有一个请求队列,所以会把接下来的请求缓存下来,缓存多少受限于队列大小。假如server已经过载,缓存队列越来越长,即使过了很久请求被处理了,对用户来说也没什么价值了。所以当token不够用时,最明智的做法就是直接拒绝用户的请求,即漏桶算法。

感谢你能够认真阅读完这篇文章,希望小编分享的“Nginx如何限流”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Nginx如何限流

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Nginx如何限流

这篇文章主要介绍了Nginx如何限流,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1 漏桶和令牌桶算法的概念漏桶算法(Leaky Bucket):主要目的是控制数据注入到
2023-06-04

nginx 限流配置

限流算法令牌桶算法算法思想是:令牌以固定速率产生,并缓存到令牌桶中;令牌桶放满时,多余的令牌被丢弃;请求要消耗等比例的令牌才能被处理;令牌不够时,请求被缓存。漏桶算法算法思想是:水(请求)从上方倒入水桶,从水桶下方流出(被处理);来不及流出
2023-06-05

怎么设置nginx限流

这篇文章主要介绍“怎么设置nginx限流”,在日常操作中,相信很多人在怎么设置nginx限流问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么设置nginx限流”的疑惑有所帮助!接下来,请跟着小编一起来学习吧
2023-06-28

nginx的限流配置过程

本篇内容介绍了“nginx的限流配置过程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!limit_req zone=req_zone;严格依
2023-06-05

基于Docker的Nginx流量控制与限流策略(如何通过Docker为Nginx设置流量控制?)

利用Docker容器化部署和管理Nginx反向代理服务器,可轻松实现流量控制和限流策略。流量控制通过令牌桶算法、漏斗算法和连接池管理请求速率。限流通过速率限制、并发连接限制和黑名单防止恶意流量冲击服务器。在Docker中实施这些策略包括修改Nginx配置文件和使用Docker命令行参数。通过结合不同的策略,可以有效管理流量,确保应用程序性能、可用性和安全性。
基于Docker的Nginx流量控制与限流策略(如何通过Docker为Nginx设置流量控制?)
2024-04-02

nginx如何请求限制

这篇文章主要介绍“nginx如何请求限制”,在日常操作中,相信很多人在nginx如何请求限制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”nginx如何请求限制”的疑惑有所帮助!接下来,请跟着小编一起来学习吧
2023-06-20

nginx如何限制php并发数

要限制PHP并发数,可以使用Nginx的limit_conn_module模块。该模块可以限制对某个特定的location或server的并发连接数。首先,确保你的Nginx已经编译安装了limit_conn_module模块。可以使用ng
2023-08-24

nginx限流及配置管理的方法

这篇文章主要介绍“nginx限流及配置管理的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nginx限流及配置管理的方法”文章能帮助大家解决问题。nginx限流http { limit_con
2023-06-30

nginx怎么使用内置模块配置限速限流

这篇文章主要介绍“nginx怎么使用内置模块配置限速限流”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nginx怎么使用内置模块配置限速限流”文章能帮助大家解决问题。有时候 NGINX 面对一些特殊
2023-06-30

SpringMVC如何实现限流

小编给大家分享一下SpringMVC如何实现限流,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!使用说明在项目中引入Guava相关包http://mvnrepository.com/artifact/com.google.g
2023-05-30

.Net Core如何实现限流

小编给大家分享一下.Net Core如何实现限流,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、环境1.vs20192..Net Core 3.13.引用 As
2023-06-20

nginx做白名单和限流的完整过程

本文详细介绍了在nginx中设置白名单和限流的完整过程。白名单用于允许特定IP地址或子网访问受限资源,而限流用于限制每个IP地址或子网每秒的请求次数。文章提供了分步指南,包括创建白名单、配置限流规则以及将白名单和限流相结合。还讨论了其他注意事项,例如在使用proxy_pass模块和监控限流规则时。这篇文章对希望在nginx中实施访问控制和性能优化的人很有用。
nginx做白名单和限流的完整过程
2024-04-02

Nginx限流与防DDoS攻击策略是什么

Nginx是一款高性能的Web服务器和反向代理服务器,可以通过一些策略来限制流量并防止DDoS攻击。限流策略:Nginx可以通过设置限流规则来限制客户端的访问频率,防止过多的请求导致服务器负载过高。可以通过配置ngx_http_limit_
Nginx限流与防DDoS攻击策略是什么
2024-05-06

Gin框架限流如何实现

本文小编为大家详细介绍“Gin框架限流如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Gin框架限流如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是限流限流是指通过一定的算法,对接口的请求进行
2023-07-05

rabbitmq削峰限流如何实现

RabbitMQ的削峰限流可以通过以下方式实现:1. 预取(Prefetch)机制:可以设置每个消费者一次从队列中获取的消息数量。通过调整预取数量,可以控制每个消费者处理消息的速度,从而实现限流。例如,将预取数量设置为1,即每次只获取一条消
2023-10-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录