Nginx之QPS限制模块解读

news2024/10/6 21:30:39

目录

基本介绍

模块配置具体解读 

limit_req_zone

limit_req

原理:漏桶算法


基本介绍

NGINX通过limit_req_zone和limit_req两条指令来实现速率限制。指令limit_req_zone定义了限速的参数,指令limit_req在所在的location使能定义的速率。

QPS即每秒查询率,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。QPS = req/sec = 请求数/秒,即每秒的响应请求数,也即是最大吞吐能力。

模块配置具体解读 

limit_req_zone指令设置了速率限制和共享内存区域的参数,但它实际上并不限制请求速率。因此我们需要通过在contexts中使用limit_req指令来将其限制应用于特定locationserver块。 

limit_req_zone

定义一个以IP为限制请求的方式,名字为req_limit_zone,开辟10M的共享内存区域,每秒处理的速率为10个请求

limit_req_zone $binary_remote_addr zone=req_limit_zone:10m rate=10r/s;

说明 :limit_req_zone指令通常在 HTTP 块中定义,使其可在多个上下文中使用,它需要以下三个参数:

  •     key - 定义应用限制的请求特性。示例中使用的是 Nginx 嵌入变量binary_remote_addr(二进制客户端地址)
  •     zone - 定义用于存储每个 IP 地址状态以及被限制请求 URL 访问频率的共享内存区域。保存在内存共享区域的信息,意味着可以在 Nginx 的 worker 进程之间共享。定义分为两个部分:通过zone=keyword标识区域的名字,以及冒号后面跟区域大小。16000 个 IP 地址的状态信息,大约需要 1MB,所以示例中区域可以存储 160000 个 IP 地址。
  •     rate - 定义最大请求速率。在示例中,速率不能超过每秒 10 个请求。Nginx 实际上以毫秒的粒度来跟踪请求,所以速率限制相当于每 100 毫秒 1 个请求。因为不允许”突发情况”,这意味着在距离前一个请求 100 毫秒内到达的请求将被拒绝。
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
 
server {
    location /login/ {
        limit_req zone=mylimit;
        
        proxy_pass http://my_upstream;
    }
}

limit_req

limit_req指令来将其限制应用于特定location或server块。

limit_req zone=req_limit_zone burst=10 nodelay;
  • limit_req zone=req_limit_zone; 每个 IP 地址被限制为每秒只能请求 10 次 URL,更准确地说,在距离前一个请求的 100 毫秒内不能请求该 URL。
  • limit_req zone=req_limit_zone burst=10; burst 参数定义了超出 req_limit_zone指定速率的情况下(示例中的 req_limit_zone区域,速率限制在每秒 10 个请求,或每 100 毫秒一个请求),客户端还能发起多少请求。距离上一个请求 100 毫秒内到达的请求将会被放入队列,我们将队列大小设置为 10。

也就是说,如果从一个给定 IP 地址发送 11 个请求,Nginx 会立即将第一个请求发送到上游服务器群,然后将余下 10 个请求放在队列中。然后每 100 毫秒转发一个排队的请求,只有当传入请求使队列中排队的请求数超过 10 时,Nginx 才会向客户端返回503。

  • limit_req zone=req_limit_zone burst=10 nodelay;  使用 nodelay 参数,可以实现无延迟的排队;Nginx 仍将根据 burst 参数分配队列中的位置,当一个请求到达时,只要在队列中能分配位置,Nginx 将立即转发这个请求。将队列中的该位置标记为”taken”(占据),并且不会被释放以供另一个请求使用,直到一段时间后才会被释放(在这个示例中是,100 毫秒后)。
limit_req zone=name [burst=number] [nodelay | delay=number];
location /login/ {
    limit_req zone=mylimit burst=20 nodelay;
    proxy_pass http://my_upstream;
}
  • 上面这段配置中我们设置了burst=20,该配置定义了客户端可以超过区域指定速率的请求数(对于我们前面定义的mylimit区域,请求速率限制为每秒 10 个请求即每 100 毫秒 1 个)。在前一个请求之后 100 毫秒内到达的请求会被放入到队列中,这里我们将队列大小设置为 20。
  • 说如果有22个请求同时发送过来,那么NGINX会马上把第1个请求根据相关规则转发给upstream服务器,然后把接下来的第2到21共计20个请求放入队列中,接着直接返回503代码给第22个请求,随后的2秒时间内,每100毫秒从队列中取出一个请求发送给upstream服务器进行处理。

原理:漏桶算法

漏桶算法(Leaky Bucket Algorithm)是一种用于流量控制和限流的经典算法。其基本原理是将请求放入一个有固定容量的“桶”中,桶内的请求以固定速率传出。当桶满时,新进入的请求将被丢弃。漏桶算法可以保证处理请求的速率恒定,从而有效防止流量激增导致的服务不稳定。 

当主机接口向网络中传送数据包时,可采取漏桶算法,使得接口输出数据流的速率恒定。

  • 输出不规则数据流的主机类似灌水的水龙头

  • 算法中定义的漏桶类似水桶

  • 不规则数据流输入漏桶类似向漏桶中灌水

流量输出漏桶类似漏桶漏水

 

接下来,详细分解一下漏桶算法在数据包传送过程中的实现原理。

1、队列接收到准备转发的数据包。

2、队列被调度,得到转发机会。由于队列配置了流量整形,队列中的数据包首先进入漏桶中。

3、根据数据包到达漏桶的速率与漏桶的输出速率关系,确定数据包是否被转发。

如果到达速率≤输出速率,则漏桶不起作用。

如果到达速率>输出速率,则需考虑漏桶是否能承担这个瞬间的流量。

  • 1) 若数据包到达的速率-漏桶流出的速率≤配置的漏桶突发速率,则数据包可被不延时的送出。
  • 2) 若数据包到达的速率-漏桶流出的速率>配置的漏桶突发速率,则多余的数据包被存储到漏桶中。暂存在漏桶中的数据包在不超过漏桶容量的情况下延时发出。
  • 3) 若数据包到达的速率-漏桶流出的速率>配置的漏桶突发速率,且数据包的数量已经超过漏桶的容量,则这些数据包将被丢弃。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1038564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT AIGC 非常实用的AI工具集合大全

实战AI 工具箱 AIGC ChatGPT 职场案例60集, Power BI 商业智能 68集, 数据库Mysql8.0 54集 数据库Oracle21C 142集, Office, Python ,ETL Excel 2021 实操,函数,图表,大屏可视化 案例实战 http://t.csdn.cn/zBytu

工厂进销存软件怎么选?

本文将为大家讲解:工厂进销存软件怎么选? 工厂的进销存管理对于生产和供应链的顺畅运作至关重要。为了更好地管理库存、优化生产和确保及时交货,工厂需要选择一款合适的进销存软件。本文将介绍工厂应该考虑的关键因素,以帮助他们…

统一系统脆弱性管理平台:让“网络安全漏洞”无处遁形

网络安全漏洞是网络节点的系统软件或应用软件在逻辑设计上的缺陷,漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使网络攻击者能够在未授权的情况下访问或破坏系统。 网络安全漏洞被利用了,危害极大。正是因为如此&…

华为云云耀云服务器L实例评测 | Docker 部署 Reids容器

文章目录 一、使用Docker部署的好处二、Docker 与 Kubernetes 对比三、云耀云服务器L实例 Docker 部署 Redis四、可视化工具连接Redis⛵小结 一、使用Docker部署的好处 Docker的好处在于:在不同实例上运行相同的容器 Docker的五大优点: 持续部署与测试…

电脑C盘爆红怎么办?(小白篇)

文章目录 前言:1、清理临时和系统文件2、更改电脑默认软件安装位置3、微信、QQ文件存储路径放在其它盘4、卸载一些不常用的软件彩蛋 前言: C盘作为电脑的系统盘,如果出现爆满或者剩余空间很小整个C盘变红,这样会导致电脑系统运行…

二次号查询API:检测手机号是否二次入网,提高用户信任度

引言 在数字时代,个人数据的安全和隐私保护变得至关重要。用户信任是在线业务成功的基石,而其中一个关键方面是保护用户的个人信息不受滥用和侵犯。为了增强用户信任度,越来越多的企业和服务提供商正在采用手机号是否二次入网检测API&#x…

【湖科大教书匠】计算机网络随堂笔记第4章(计算机网络网络层)

目录 4.1、网络层概述 简介 要实现网络层任务,需要解决一下主要问题: 网络层向运输层提供怎样的服务(“可靠传输”还是“不可靠传输”) 网络层寻址问题 路由选择问题 路由器收到数据后,是依据什么来决定将数据包从自己…

es6模块化,怎么判断当前文件使用的是es6的模块化还是commenjs的模块化

es6的模块化,文件中的this,指向undefined,不是指向window import.meta - JavaScript | MDN

Linux学习之HIS部署(4)

ElasticSearch部署 ElasticSearch资源 RabbitMQ资源 ElasticSearch服务部署 #OpenJDK环境部署 [rootServices ~]# yum clean all; yum repolist -v ... Total packages: 8,265 [rootServices ~]# yum -y install java-1.8.0-openjdk-devel.x86_64 #安装OpenJDk ... Compl…

nodejs在pdf中绘制表格

需求 之前我已经了解过如何在pdf模板中填写字段了 nodejs根据pdf模板填入中文数据并生成新的pdf文件https://blog.csdn.net/ArmadaDK/article/details/132456324 但是当我具体使用的时候,我发现我的模板里面有表格,表格的长度是不固定的,所…

【Kafka系列】(二)Kafka的基本使用

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址[1] 文章更新计划[2] 系列文章地址[3] Kafka 线上集群部署方案怎么做 操作系统 先说结论,Kafka 部署在 Linux 上要比 Window…

代码随想录笔记--动态规划篇

1--动态规划理论基础 动态规划经典问题:① 背包问题;② 打家劫舍;③ 股票问题; ④ 子序列问题; 动态规划五部曲: ① 确定 dp 数组及其下标的含义; ② 确定递推公式; ③ 确定 dp 数组…

docker下redis备份文件dump.rdb获取

1.查看镜像 docker ps -a 2.进入redis客户端 docker exec -it redis redis-cli 3.保存备份文件 save 4.查看文件存放位置 CONFIG GET dir 5.将docker中文件拷出 docker cp id或name:容器中文件的路径 目标目录地址

学生党台灯哪款好一点?适合学生党使用的台灯推荐

不知道大家有没有仔细观察过身边的小学生以及中学生,很多孩子都戴上了眼镜。其实造成孩子近视的原因有很多,大部分家长认为主要原因还是在使用电子产品上,其实不止如此,经常使用电子产品,确实容易造成近视,…

内核和用户空间中的TID,GID, PID,uid

要获取关于eBPF中的进程信息,可以使用以下函数: bpf_get_current_pid_tgid()、 bpf_get_current_uid_gid()、 bpf_get_current_comm(char *buf, int size_of_buf)。 当程序被绑定到对某个内核函数调用时,就可以使用它们。UID/GID应该比较明确&#xff0c…

sudo文件的配置以及gccg++工具的使用

目录 sudo无法运行的原因 sudoers文件的配置 1.切换到root账户 2.打开sudoers文件 ​编辑 3.开始文件配置 gcc&g工具的使用 预处理 为什么要有条件编译呢? gcc预处理文件 编译 汇编 链接 动态库和静态库 sudo无法运行的原因 之前我们说过,普通用户在…

[Linux入门]---进程的概念

文章目录 1.进程的概念①描述进程-PCB②task_struct-PCB的一种③task_ struct内容分类 2.查看进程3.通过系统调用获取进程表示符4.通过系统调用创建进程---fork初识 1.进程的概念 在我们的电脑开机的时候,操作系统会被加载到内存中,点击多个应用进行时&a…

【校招VIP】前端js语言考点之ES6

考点介绍: es6就是es5的升级版,es5是js的通用标准,绝大多数浏览器都支持其语法,但是es6则不同,如果es6的代码需要在浏览器上运行,那就先将es6转换为es5。如果在es6中使用模块化机制,需要将个模块…

OAuth2.0客户端基于oltu搭建

之前提到了cas-server这个项目其本身是支持OAuth2.0协议的,因此我们可以简单搭建一个OAuth客户端,本次使用到的是Apache的oltu oltu介绍 Apache Oltu 是一个开源的 OAuth 库,用于帮助开发者实现 OAuth 1.0 和 OAuth 2.0 协议。OAuth 是一种用于授权和认证的协议&a…