目录

一、Nginx限流

1、漏桶算法(限制请求次数)

2、令牌桶算法(限制请求速度)

3、计数器(限制连接数)

4、两种算法的区别

二、漏桶算法的基本配置

1、控制速率

①添加内容

②配置 server,使用 limit_req 指令应用限流

③测试

2.处理突发流量

3.配置  nodelay

三、 令牌桶算法配置

1、限制下载速度

2、添加 limit_rate_after 1m  命令

3、限制连接数


流量限制(rate-limiting)是nginx最有用的功能之一,却经常被错误理解和错误配置。它允许我们限制用户在给定时间内可以发出的HTTP请求数量。例如请求网站首页的GET请求,表单登录的POST请求等。

速率限制可以出于安全目的使用。例如,可以降低暴力破解账号密码的攻击速度。通过将传入请求速率限制为实际用户的典型值,并(通过记录)标识目标URL,它可以帮助我们防御DDOS攻击。而更为通用的用法是,防止上游应用程序服务器同时被太多用户请求所淹没。

一、Nginx限流

Nginx 提供两种限流方式,一是控制速率,二是控制并发连接数。

1、漏桶算法(限制请求次数)

漏桶算法思路很简单,请求先进入到漏桶里,漏桶以固定的速度出水,也就是处理请求,当水加的过快,则会直接溢出,也就是拒绝请求,可以看出漏桶算法能强行限制数据的传输速率

是对于很多场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发传输。这时候漏桶算法可能就不合适了,令牌桶算法更为适合。

2、令牌桶算法限制请求速度

对于很多应用场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发传输。这时候漏桶算法可能就不合适了,令牌桶算法更为适合。

令牌桶算法的原理是系统以恒定的速率产生令牌,然后把令牌放到令牌桶中,令牌桶有一个容量,当令牌桶满了的时候,再向其中放令牌,那么多余的令牌会被丢弃;当想要处理一个请求的时候,需要从令牌桶中取出一个令牌,如果此时令牌桶中没有令牌,那么则拒绝该请求。

3、计数器限制连接数

计数器比较简单粗暴,比如我们限制的是1s能够通过的请求数,实现的思路就是从第一个请求进来开始计时,在接下来的1s内,每个请求进来请求数就+1,超过最大请求数的请求会被拒绝,等到1s结束后计数清零,重新开始计数。

这种方式有个很大的弊端:比如前10ms已经通过了最大的请求数,那么后面的990ms的请求只能拒绝,这种现象叫做“突刺现象”。

4、两种算法的区别

漏桶算法输入的时候请求不固定,但都会在漏桶里边先保存起来(小于漏桶的容量),然后输出的时候采用的是恒定的速率执行请求,有点像队列的先进先出,只是队列中的元素出队的时间间隔一致。

令牌桶算法跟漏桶算法刚好相反,令牌桶的大小就是接口所能承载的最大访问量,令牌的发放是恒速的,而最终能在某一时间处理的请求数不是恒定的,这取决于单位时间内令牌桶中的令牌数量。

从作用上来说,漏桶和令牌桶算法最明显的区别就是是否允许突发流量(burst)的处理,漏桶算法能够强行限制数据的实时传输(处理)速率,对突发流量不做额外处理;而令牌桶算法能够在限制数据的平均传输速率的同时允许某种程度的突发传输。

Nginx官方版本限制IP的连接和并发分别有两个模块:

limit_req_zone 用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 "leaky bucket"。

limit_req_conn 用来限制同一时间连接数,即并发限制。

二、漏桶算法的基本配置

1、控制速率

①添加内容

vim /usr/local/nginx/conf/nginx.conf

在http中添加

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

limit_req_zone:用来限制单位时间内的请求数

$binary_remote_addr:定义限流对象,binary_remote_addr是一种key,表示基于 remote_addr(客户端IP) 来做限流,binary_ 的目的是压缩内存占用量。

zone=one:10m:定义共享内存区来存储访问信息, one:10m 表示一个大小为10M,名字为one的内存区域。1M能存储16000 IP地址的访问信息,10M可以存储16W IP地址访问信息。

rate=1r/s:用于设置最大访问速率,rate=10r/s 表示每秒最多处理10个请求。Nginx 实际上以毫秒为粒度来跟踪请求信息,因此 10r/s 实际上是限制:每100毫秒处理一个请求。这意味着,自上一个请求处理完后,若后续100毫秒内又有请求到达,将拒绝处理该请求。

配置 server,使用 limit_req 指令应用限流

在location中添加

limit_req zone=one;

③测试

访问页面,在一秒内快速刷新

2.处理突发流量

现在超过1个请求就丢弃,没有“桶”的概念,所以我们需要添加一个“桶”

在  limit_req zone=one  后加上brust=8;

Burst:爆发,处理突发请求

burst参数定义了超出zone指定速率的情况下(示例中的mylimit区域,速率限制在每秒10个请求,或每100毫秒一个请求),客户端还能发起多少请求。上一个请求100毫秒内到达的请求将会被放入队列,我们将队列大小设置为8。

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

 

查看发现,我们访问了21个,一个请求立即进到上游服务器群,进入桶里8个,失败12个。

不过,单独使用 burst 参数并不实用。假设 burst=50 ,rate依然为10r/s,排队中的50个请求虽然每100ms会处理一个,但第50个请求却需要等待 50 * 100ms即 5s,这么长的处理时间自然难以接受。

因此,burst 往往结合 nodelay 一起使用。

3.配置  nodelay

表示我不要任何的延迟,只要burst桶一满就返回503 报错

配置完成后就没有等待的感觉

效果相当于每秒10个请求的“流量限制”。如果希望不限制两个请求间允许间隔的情况下实施“流量限制”,nodelay参数是很实用的。

报错日志可以去  /usr/local/nginx/logs/access.logs   里去查看

三、 令牌桶算法配置

limit_req 

令牌以每秒五个的速度往桶里放牌子;每个请求领一个牌子

一个请求可以领多个牌子,增加请求速率

1、限制下载速度

在配置中添加  

 limit_rate 1k   :限制下载速度在1k左右

2、添加 limit_rate_after 1m  命令

就是在下载多少内容后再以limit_rate限制的速率下载,多用于浏览视频

先给你一点先看,再慢慢给你缓存观看,等你欲罢不能的时候,让你冲会员,冲完会员就快了!!!

先给你下载5M,再以1k速度左右下载

3、限制连接数

添加内容

limit_conn_zone $binary_remote_addr zone=two:10m;

limit_conn_zone 1 表示限制单个IP同时最多能持有1个连接。

limit_conn two 1 表示虚拟主机(server) 同时能处理并发连接的总数。

需要注意的是:只有当 request header 被后端server处理后,这个连接才进行计数。

全部访问成功了,看不出什么限制效果,我们添加限制速度

发现失败了大部分,因为限制了并发数,他就会等待第一个请求处理完成后,才能处理第二个,而我们增加了限制处理速度,处理速度很慢,所以就失败了很多个

Nginx--流量限制(最有用的功能之一)相关推荐

  1. nginx-module-vts监控nginx流量

    目录 一.nginx监控模块简介 二.配置nginx-module-vst-master 2.1 上传nginx-module-vst-master软件包 2.2 安装nginx依赖环境 2.3 编译 ...

  2. CentOS 6.3安装Nginx开启目录浏览、下载功能

    本次实验实现目的: 安装Nginx,Nginx开启目录浏览.下载功能,开机默认启动:咐件自带开机启动脚本.重启脚本: 1.关闭SELINUX 查看获取SELinux的状态: [root@localho ...

  3. Element Table 可以实现哪些常见的有用的功能

    最近项目中频繁使用 table 功能,因为 UI 框架使用的又是 Element UI,于是总结下在 Element 下 el-table 组件使用技巧. 1.行背景色 table 组件提供了 row ...

  4. 太方便 微信能精准搜图片了!网友:出点有用的功能有多难?

    上个月底,微信向iOS用户发布了8.0.18正式版,首次支持朋友圈发送超过9张照片,现在可以发最多20张照片了,且超过9张之后会显示制作成新的视频.而在近日,正当部分用户还没用上这些功能的时候,微信& ...

  5. Nginx增加m3u8流视频文件功能模块 推流和拉流

    Nginx增加m3u8流视频文件功能模块 推流和拉流 FastDFS分布式文件系统安装和配置_亲测成功 ./configure --prefix=/u06/data/apps/nginx-rtmp \ ...

  6. ES2019 中 8 个非常有用的功能

    ES2019 规范是对 JavaScript的小规模扩展,但仍带来了一些有趣的功能.本文向你展示八个 ES2019 的功能,这些功能可以使你的开发变得更轻松. String.prototype.tri ...

  7. 2023年全网最新取图小程序源码搭建,带达人流量主会员专题模板功能

    取图小程序搭建源码分享,带达人流量主会员专题模板功能,2023年全网最新系统 壁纸表情包头像背景图 所以现在就给搭建上干货.市面上功能最强大的取图系统,完爆市面上那些泛滥过时的系统.达人+流量主+会员 ...

  8. Nginx 又一牛X的功能!流量拷贝

    「 读者福利!2 TB 各类技术资源免费赠送 」 1. 需求 将生产环境的流量拷贝到预上线环境或测试环境,这样做有很多好处,比如: 可以验证功能是否正常,以及服务的性能: 用真实有效的流量请求去验证, ...

  9. nginx下目录浏览及其验证功能、版本隐藏等配置记录

    工作中常常有写不能有网页下载东西的需求,在Apache下搭建完成后直接导入文件即可达到下载/显示文件的效果; 而Nginx的目录列表功能默认是关闭的,如果需要打开Nginx的目录列表功能,需要手动配置 ...

  10. 基于Gor实现流量复制(加middleware功能增强)

    最近做功能重构,在上线前要求验证重构后的代码与老代码实现逻辑是否一致,基于这个需求,需要在生产环境做一个功能将生产服务器上的流量复制一份发送到测试服务器上. 就这个事情这几天考察了三种技术,1. 基于 ...

最新文章

  1. Keras实现mode.fit和model.fit_generator比较
  2. 产品设计 | 价格理论与用户体验
  3. [Jarvis OJ - PWN]——[XMAN]level0
  4. Android实用笔记——使用Spinner实现下拉列表
  5. 开发们 点广告-赚点BT币
  6. Python 数据分析三剑客之 Pandas(三):算术运算与缺失值的处理
  7. 迅为4412开发板开发笔记--开发板与主机和ubuntu的ping通
  8. Windows7 登陆失败:未知的用户名或密码错误 网络共享文件夹
  9. ireport怎么套打_DNF小小王国历险记巨人击退战怎么打 巨人击退战通关技巧攻略...
  10. python读取配置文件获取所有键值对_Python读取properties配置文件操作示例
  11. 史上最详细的宝塔部署java项目流程
  12. Matlab2016a 安装
  13. 计算机开机硬盘扫描,解决每次开机都检测硬盘
  14. kb2999226此更新不适用你的计算机,Windows Server 2012 R2 安装补丁KB2999226提示此更新不适合用于计算机...
  15. openssl error while loading serial number
  16. 使用Nexus在Windows中搭建Maven私服
  17. 【通信原理 入坑之路】 —— 详细理解傅里叶变换以及它在通信里面的应用
  18. 模2除法与二进制除法
  19. 二进制颜色代码大全(含图)
  20. 如何搭建个人网站(内容详细,适合新手)

热门文章

  1. Oracle VM VirtualBox 从虚拟软盘加载系统
  2. U盘分区了怎么恢复?详细演示两个方法
  3. Ubuntu 16.04 笔记本双显卡安装 CUDA9.0
  4. 凌晨起来肝的一篇 Java 学习路线,保证学弟学妹们大三大四的时候顺利找到实习 Offer
  5. 美化版缤纷彩色文字广告代码文字+网站添加AD教程
  6. Xcode8去除控制台多余打印
  7. 土地资源管理就业怎么这么难_我所理解的土地资源管理专业
  8. rgb转换 css 字体
  9. 织梦模板建站必须学会的基本代码
  10. 【渝粤题库】陕西师范大学292161社会保障概论 作业(专升本)