nginx: 按ip地址限流

news/2024/12/27 13:31:08/文章来源:https://www.cnblogs.com/architectforest/p/18424026

一,以固定的速度提供服务

语法:

例子

limit_req_zone $binary_remote_addr zone=test:10m rate=2r/s;server {    location / {        limit_req zone=test;    }}

语法:

imit_req_zone 用于设置限流和共享内存区域的参数,格式为:

limit_req_zone key zone rate。

key: 定义限流对象,
        $binary_remote_addr 是 nginx 中的变量,表示基于 remote_addr(客户端IP) 来做限流。

zone: 定义共享内存区来存储访问信息,
           访问信息包括每个 IP 地址状态和访问受限请求 URL 的频率等 
           zone 的定义分为两个部分:由 zone= 关键字标识的区域名称,以及冒号后面的区域大小。
           test:10m 表示一个大小为10M,名字为 test 的内存区域。
           1M 能存储16000个 IP 地址的访问信息,test 大概可以存储约160000个地址。
          nginx 创建新记录的时候,会移除前60秒内没有被使用的记录,
         如果释放的空间还是存储不了新的记录,会返回503的状态码。

rate: 设置最大的访问速率。
          rate=2r/s(为了好模拟,rate 设置的值比较小),表示每秒最多处理 2个请求。
         事实上 nginx 是以毫秒为粒度追踪请求的,rate=2r/s 实际上是每500毫秒1个请求,
         即,上一个请求完成后,如果500毫秒内还有请求到达,这些请求会被拒绝
      (默认返回503,如果想修改返回值,可以设置limit_req_status)

limit_req_zone 只是设置限流参数,如果要生效的话,必须和 limit_req 配合使用。
limit_req 的格式为:

limit_req zone=name [burst=number] [nodelay]

 

上面的配置保证了 nginx 以固定的速度提供服务(2r/s),但是这种情况不适用于有突发流量的情况,
我们希望可以尽可能的缓存请求并处理它们

二,增加队列

例子:

limit_req_zone $binary_remote_addr zone=test:10m rate=2r/s;
server {    location / {        limit_req zone=test burst=5;    }}

burst 表示在超过设定的访问速率后能额外处理的请求数。
        当 rate=2r/s 时,表示每500ms 可以处理一个请求。
        burst=5时,如果同时有10个请求到达,nginx 会处理第1个请求,
                        剩余9个请求中,会有5个被放入队列,剩余的4个请求会直接被拒绝。
                        然后每隔500ms从队列中获取一个请求进行处理,
                        此时如果后面继续有请求进来,如果队列中的请求数目超过了5,会被拒绝,
                        不足5的时候会添加到队列中进行等待。
                        我们可以理解为现在的桶可以存5滴水:

三,让队列中请求无需等待:

配置 burst 之后,虽然同时到达的请求不会全部被拒绝,
但是仍需要等待500ms 一次的处理时间,放入桶中的第5个请求需要等待500ms * 4的时间才能被处理,
更长的等待时间意味着用户的流失,在许多场景下,这个等待时间是不可接受的。
此时我们需要增加 nodelay 参数,和 burst 配合使用。

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

server { location / { limit_req zone=test burst=5 nodelay; }}

nodelay 表示不延迟。设置 nodelay 后,第一个到达的请求和队列中的请求会立即进行处理,不会出现等待的请求。

需要注意的是,
虽然队列中的5个请求立即被处理了,但是队列中的位置依旧是按照500ms 的速度依次被释放的。
后面的4个请求依旧是被拒绝的,长期来看并不会提高吞吐量的上限,
长期吞吐量的上限是由设置的 rate 决定的。

说明:
参考自:
https://blog.csdn.net/cold___play/article/details/132094865

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Free5GC源码研究(2) - 单个NF的软件架构

前文我们总览了free5gc的总体软件架构。整一个free5gc系统又由几个NF(Network Function)组成,所以本文继续深入研究单个NF的软件架构。要研究NF的软件架构,最直接的方式是找一个简单的NF来回观摩。free5gc/ausf算是比较简单的一个,然而我发现了一个更简单的NF,叫做andy89…

一,初始 MyBatis-Plus

一,初始 MyBatis-Plus @目录一,初始 MyBatis-Plus1. MyBatis-Plus 的概述2. 入门配置第一个 MyBatis-Plus 案例3. 补充说明:3.1 通用 Mapper 接口介绍3.1.1 Mapper 接口的 “增删改查”3.1.1.1 查询所有记录3.1.1.2 插入一条数据3.1.1.3 删除一条数据3.1.1.4 更新一条数据3.…

[神经网络与深度学习笔记]LDA降维

LDA降维 LinearDiscriminant Analysis 线性判别分析,是一种有监督的线性降维算法。与PCA保持数据信息不同,LDA的目标是将原始数据投影到低维空间,尽量使同一类的数据聚集,不同类的数据尽可能分散 步骤:计算类内散度矩阵\(S_b\) 计算类间散度矩阵\(S_w\) 计算矩阵\(S_w^{-1…

C++ 指针和迭代器支持的操作

▲ 《C++ Primer》 P96 指针也都支持上面的操作。

代码整洁之道--读书笔记(14)

代码整洁之道简介: 本书是编程大师“Bob 大叔”40余年编程生涯的心得体会的总结,讲解要成为真正专业的程序员需要具备什么样的态度,需要遵循什么样的原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来者引路,助其职业生涯迈上更…

hexo安装后报错hexo 不是内部或外部命令,也不是可运行的程序 或批处理文件。

hexo问题 之前利用hexo和gitee搭建了一个博客,但是最近gitee的gitpage停止服务了,便想着在github上搭建一个。 在到安装hexo这一步的时候,一直报错hexo 不是内部或外部命令,也不是可运行的程序 或批处理文件。 我的所有安装步骤和环境变量发现都没有错,反复配置后去找了一…

跑冒滴漏监测系统

跑冒滴漏监测系统应用计算机视觉和深度学习技术对危化品生产区域实时检测,当检测到液体泄露时,立即抓拍存档告警并回传给后台监控平台方便人员及时处理,提高图像数据的实时监控效率。跑冒滴漏监测系统7*24小时不间断对监控画面实时分析监测,避免意外事故发生,同时降低人力…

学校食堂明厨亮灶监控系统

学校食堂明厨亮灶监控系统通过卷积神经网络学习与图像识别技术,学校食堂明厨亮灶监控系统将对现场监控画面进行24小时实时分析,如:厨房出现老鼠狗猫、厨师未戴口罩、厨师未戴厨师帽、厨师服穿戴识别、抽烟识别、玩手机识别,同时实时抓拍相关情况,全程记录留痕,提升监管效…

河道采砂识别监测系统

河道采砂识别监测系统借助深度视觉边缘分析技术,自动对监控区域违法采砂进行实时监测。如果河道采砂识别监测系统监测到有人违法采砂时,立即抓拍存档预警,将违规采砂截图发给后台管理中心,提醒后台人员及时处理。河道采砂识别监测系统可根据时间段违规记录、视频进行查找,…

煤炭传送带状态检测系统

煤炭传送带状态检测系统通过机器视觉+边缘分析技术对煤炭皮带状况进行实时监测,一旦煤炭传送带状态检测系统监测到皮带跑偏、堆煤、撕裂、异物等其他情况,煤炭传送带状态检测系统马上开展警报提醒,通知后台监控平台,并提醒相关人员及时处置。煤炭传送带状态检测系统同时把告…

城市道路积水识别监测系统

城市道路积水识别监测系统基于机器视觉分析,城市道路积水识别监测系统实时识别街道路面积水情况,对严重积水时立即报警。城市道路积水识别监测系统对低洼区域进行实时监测,一旦城市道路积水识别监测系统监测到街道路面积水时,立即进行抓拍告警,告知监控管理中心,提醒相关…

Thinkphp8安装topthink/think-captcha验证码的和使用方法

ThinkPHP8默认没有验证码,安装验证码可以使用composer来安装验证码 一、安装验证码 执行composer安装验证码 composer require topthink/think-captcha二、使用方法 1、在目录app\middleware.php中开启session \think\middleware\SessionInit::class 2、配置验证码 安装好验证…