返回顶部
首页 > 资讯 > 精选 >Nginx如何限流
  • 694
分享到

Nginx如何限流

2023-06-04 09:06:59 694人浏览 安东尼
摘要

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

这篇文章主要介绍了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如何限流”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: Nginx如何限流

本文链接: https://lsjlt.com/news/237162.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Nginx如何限流
    这篇文章主要介绍了Nginx如何限流,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1   漏桶和令牌桶算法的概念漏桶算法(Leaky Bucket):主要...
    99+
    2023-06-04
  • nginx 限流配置
    限流算法令牌桶算法算法思想是:令牌以固定速率产生,并缓存到令牌桶中;令牌桶放满时,多余的令牌被丢弃;请求要消耗等比例的令牌才能被处理;令牌不够时,请求被缓存。漏桶算法算法思想是:水(请求)从上方倒入水桶,从水桶下方流出(被处理);来不及流出...
    99+
    2023-06-05
  • 怎么设置nginx限流
    这篇文章主要介绍“怎么设置nginx限流”,在日常操作中,相信很多人在怎么设置nginx限流问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么设置nginx限流”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-28
  • nginx的限流配置过程
    本篇内容介绍了“nginx的限流配置过程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!limit_req zone=req_zone;严格依...
    99+
    2023-06-05
  • nginx如何请求限制
    这篇文章主要介绍“nginx如何请求限制”,在日常操作中,相信很多人在nginx如何请求限制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”nginx如何请求限制”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-20
  • nginx限流及配置管理的方法
    这篇文章主要介绍“nginx限流及配置管理的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nginx限流及配置管理的方法”文章能帮助大家解决问题。nginx限流http { ...
    99+
    2023-06-30
  • nginx如何限制php并发数
    要限制PHP并发数,可以使用Nginx的limit_conn_module模块。该模块可以限制对某个特定的location或serv...
    99+
    2023-08-24
    nginx php
  • nginx怎么使用内置模块配置限速限流
    这篇文章主要介绍“nginx怎么使用内置模块配置限速限流”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nginx怎么使用内置模块配置限速限流”文章能帮助大家解决问题。有时候 NGINX 面对一些特殊...
    99+
    2023-06-30
  • 如何实现redis限流
    如何实现redis限流?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。redis限流的实现方式有3种,分别是:第一种:基于Redis的set...
    99+
    2024-04-02
  • redis如何实现限流
    redis实现限流的示例:使用接口实现,接口代码如下:#指定用户user_id的某个行为action_key在特定的时间内period只允许发生最多的次数max_countdef is_action_al lowed(u...
    99+
    2024-04-02
  • SpringMVC如何实现限流
    小编给大家分享一下SpringMVC如何实现限流,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!使用说明在项目中引入Guava相关包http://mvnrepository.com/artifact/com.google.g...
    99+
    2023-05-30
    spring mvc
  • nginx限流及配置管理实战记录
    目录nginx限流限制并发连接数限制相同客户端的访问频次burstnodelaylimit_rate限制带宽nginx配置管理自动索引expire缓存配置日志轮询禁止不必要的目录日志...
    99+
    2024-04-02
  • Nginx限流和黑名单配置的策略
    目录1 背景介绍2 Nginx 的限流策略2.1 limit_req_zone限制访问频率2.2 limit_conn_zone限制最大连接数3 黑名单设置1 背景介绍 为了防止一些...
    99+
    2024-04-02
  • .Net Core如何实现限流
    小编给大家分享一下.Net Core如何实现限流,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、环境vs2019.Net Core 3.1引用 AspNetCo...
    99+
    2023-06-20
  • Nginx限流与防DDoS攻击策略是什么
    Nginx是一款高性能的Web服务器和反向代理服务器,可以通过一些策略来限制流量并防止DDoS攻击。 限流策略:Nginx可以通...
    99+
    2024-05-06
    Nginx DDoS攻击
  • nginx使用内置模块配置限速限流的方法实例
    有时候 NGINX 面对一些特殊的场景时,需要进行一定的限速限流的配置,比如一个官网,可能前端静态文件是非常小的,但是同时配置的还有一些 apk 包,这些包如果不做任何限制,可能会形...
    99+
    2024-04-02
  • Java如何实现接口限流
    小编给大家分享一下Java如何实现接口限流,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!RateLimiterGoogle开源工具包Guava提供了限流工具类RateLimiter,基于令牌桶算法实现。1.maven依赖:...
    99+
    2023-06-21
  • rabbitmq削峰限流如何实现
    RabbitMQ的削峰限流可以通过以下方式实现:1. 预取(Prefetch)机制:可以设置每个消费者一次从队列中获取的消息数量。通...
    99+
    2023-10-09
    rabbitmq
  • sentinel如何整合spring cloud限流
    这篇文章将为大家详细讲解有关sentinel如何整合spring cloud限流,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。spring cloud基于http进行服务调用,大致过程如下:服务...
    99+
    2023-06-29
  • java接口限流如何实现
    在Java中实现接口限流可以使用以下几种方式: 计数器:维护一个计数器来统计每个接口的请求数量,当请求数量超过设定的阈值时,拒绝后...
    99+
    2023-10-25
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作