首页 网站首页 商业信息 限流 查看内容

Linux下玩转nginx系列(七)---nginx如何实现限流功能

私域运营 2022-12-23 22:33 14062人围观 限流

nginx是最火的负载平衡工具之一,在流量陡增的互联网眼前,针对高并发的场景,接口限流是很有需要的。流量限制(rate-limiting),是nginx中一个很是适用的功用。流量限制可以用作平安目标,比如可以减慢暴力密码破解的速度。经过将传入请求的速度限制为实在用户的典型值,并标识方针URL地址(经过日志),还可以用来抵抗DDOS进犯。更常见的情况,该功用被用来庇护上游利用办事器不被同时太多用户请求所压垮。下面先容一下nginx中是若何对请求停止流量限制的。

限流算法

令牌桶算法





算法思惟是:

  • 令牌以牢固速度发生,并缓存到令牌桶中;
  • 令牌桶放满时,过剩的令牌被抛弃;
  • 请求要消耗等比例的令牌才能被处置;
  • 令牌不够时,请求被缓存。

漏桶算法





算法思惟是:

  • 水(请求)从上方倒入水桶,从水桶下方流出(被处置);
  • 来不及流出的水存在水桶中(缓冲),以牢固速度流出;
  • 水桶满后水溢出(抛弃);
  • 这个算法的焦点是:缓存请求、匀速处置、过剩的请求间接抛弃。

相比漏桶算法,令牌桶算法分歧之处在于它不单有一只“桶”,还有个行列,这个桶是用来寄存令牌的,行列才是用来寄存请求的。

从感化上来说,漏桶和令牌桶算法最明显的区分就是能否答应突发流量(burst)的处置,漏桶算法可以强行限制数据的实时传输(处置)速度,对突发流量不做额外处置;而令牌桶算法可以在限制数据的均匀传输速度的同时答应某种水平的突发传输。

Nginx按请求速度限速模块利用的是漏桶算法,即可以强行保证请求的实时处置速度不会跨越设备的阈值。

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

  • limit_req_zone 用来限制单元时候内的请求数,即速度限制,采用的漏桶算法 “leaky bucket”。
  • limit_req_conn 用来限制同一时候毗连数,即并发限制。

limit_req_zone 参数设置

Syntax: limit_req zone=name [burst=number] [nodelay];
Default: —
Context: http, server, location
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
  • 第一个参数:$binary_remote_addr 暗示经过remote_addr这个标识来做限制,“binary_”的目标是缩写内存占用量,是限制同一客户端ip地址。
  • 第二个参数:zone=one:10m暗示天生一个巨细为10M,名字为one的内存地区,用来存储拜候的频次信息。
  • 第三个参数:rate=1r/s暗示答应不异标识的客户真个拜候频次,这里限制的是每秒1次,还可以有比如30r/m的。
limit_req zone=one burst=5 nodelay;
  • 第一个参数:zone=one 设备利用哪个设置地区来做限制,与上面limit_req_zone 里的name对应。
  • 第二个参数:burst=5,重点说明一下这个设置,burst爆发的意义,这个设置的意义是设备一个巨细为5的缓冲区当有大量请求(爆发)过来时,跨越了拜候频次限制的请求可以先放到这个缓冲区内。
  • 第三个参数:nodelay,假如设备,跨越拜候频次而且缓冲区也满了的时辰就会间接返回503,假如没有设备,则一切请求会期待排队。

例子:

http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
location /search/ {
limit_req zone=one burst=5 nodelay;
}
}

下面设置可以限制特定UA(比如搜索引擎)的拜候:

limit_req_zone $anti_spider zone=one:10m rate=10r/s;
limit_req zone=one burst=100 nodelay;
if ($http_user_agent ~* "googlebot|bingbot|Feedfetcher-Google") {
set $anti_spider $http_user_agent;
}

其他参数

Syntax: limit_req_log_level info | notice | warn | error;
Default:
limit_req_log_level error;
Context: http, server, location

当办事器由于limit被限速或缓存时,设置写入日志。提早的记录比拒绝的记录低一个级别。例子:limit_req_log_level notice提早的的根基是info。

Syntax: limit_req_status code;
Default:
limit_req_status 503;
Context: http, server, location

设备拒绝请求的返回值。值只能设备 400 到 599 之间。

ngx_http_limit_conn_module 参数设置

这个模块用来限制单个IP的请求数。并非一切的毗连都被计数。只要在办事器处置了请求而且已经读取了全部请求头时,毗连才被计数。

Syntax: limit_conn zone number;
Default: —
Context: http, server, location
limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
location /download/ {
limit_conn addr 1;
}

一次只答应每个IP地址一个毗连。

limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;

server {
...
limit_conn perip 10;
limit_conn perserver 100;
}

可以设置多个limit_conn指令。例如,以上设置将限制每个客户端IP毗连到办事器的数目,同时限制毗连到虚拟办事器的总数。

Syntax: limit_conn_zone key zone=name:size;
Default: —
Context: http
limit_conn_zone $binary_remote_addr zone=addr:10m;

在这里,客户端IP地址作为关键。请留意,不是remote_addrremoteaddr,而是利用binary_remote_addrbinaryremoteaddr变量。 remote_addrremoteaddr变量的巨细可以从7到15个字节不等。存储的状态在32位平台上占用32或64字节的内存,在64位平台上总是占用64字节。对于IPv4地址,binary_remote_addrbinaryremoteaddr变量的巨细始终为4个字节,对于IPv6地址则为16个字节。存储状态在32位平台上始终占用32或64个字节,在64位平台上占用64个字节。一个兆字节的地区可以连结大约32000个32字节的状态或大约16000个64字节的状态。假如地区存储耗尽,办事器会将毛病返回给一切其他请求。

Syntax: limit_conn_log_level info | notice | warn | error;
Default:
limit_conn_log_level error;
Context: http, server, location

当办事器限制毗连数时,设备所需的日志记录级别。

Syntax: limit_conn_status code;
Default:
limit_conn_status 503;
Context: http, server, location

设备拒绝请求的返回值。

限流实例

一. 限制拜候速度

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

上述法则限制了每个IP拜候的速度为2r/s,并将该法则感化于根目录。假如单个IP在很是短的时候内并发发送多个请求,成果会怎样呢?




我们利用单个IP在10ms内发并发送了6个请求,只要1个成功,剩下的5个都被拒绝。我们设备的速度是2r/s,为什么只要1个成功呢,能否是Nginx限制错了?固然不是,是由于Nginx的限流统计是基于毫秒的,我们设备的速度是2r/s,转换一下就是500ms内单个IP只答应经过1个请求,从501ms起头才答应经过第二个请求。

二. burst缓存处置

在短时候内发送了大量请求,Nginx依照毫秒级精度统计,超越限制的请求间接拒绝。这在现实场景中不免过于刻薄,实在收集情况中请求到来不是匀速的,极能够有请求“突发”的情况,也就是“一股子一股子”的。Nginx斟酌到了这类情况,可以经过burst关键字开启对突发请求的缓存处置,而不是间接拒绝。
来看设置:

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

我们加入了burst=4,意义是每个key(此处是每个IP)最多答应4个突发请求的到来。假如单个IP在10ms内发送6个请求,成果会怎样呢?




相比实例一成功数增加了4个,这个我们设备的burst数目是分歧的。具体处置流程是:1个请求被立即处置,4个请求被放到burst行列里,别的一个请求被拒绝。经过burst参数,我们使得Nginx限流具有了缓存处置突发流量的才能。

可是请留意:burst的感化是让过剩的请求可以先放到行列里,渐渐处置。假如不加nodelay参数,行列里的请求不会立即处置,而是依照rate设备的速度,以毫秒级切确的速度渐渐处置。

三. nodelay下降排队时候

实例二中我们看到,经过设备burst参数,我们可以答应Nginx缓存处置一定水平的突发,过剩的请求可以先放到行列里,渐渐处置,这起到了平滑流量的感化。可是假如行列设备的比力大,请求排队的时候就会比力长,用户角度看来就是RT变长了,这对用户很不友爱。有什么处理法子呢?nodelay参数答应请求在排队的时辰就立即被处置,也就是说只要请求可以进入burst行列,就会立即被背景worker处置,请留意,这意味着burst设备了nodelay时,系统瞬间的QPS能够会跨越rate设备的阈值。nodelay参数要跟burst一路利用才有感化。

延续实例二的设置,我们加入nodelay选项:

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

单个IP 10ms内并发发送6个请求,成果以下:




跟实例二相比,请求成功率没变化,可是整体耗时变短了。这怎样诠释呢?实例二中,有4个请求被放到burst行列傍边,工作进程每隔500ms(rate=2r/s)取一个请求停止处置,最初一个请求要排队2s才会被处置;实例三中,请求放入行列跟实例二是一样的,但分歧的是,行列中的请求同时具有了被处置的资历,所以实例三中的5个请求可以说是同时起头被处置的,花费时候自然变短了。

可是请留意,虽然设备burst和nodelay可以下降突发请求的处置时候,可是持久来看并不会进步吞吐量的上限,持久吞吐量的上限是由rate决议的,由于nodelay只能保证burst的请求被立即处置,但Nginx会限制行列元素开释的速度,就像是限制了令牌桶中令牌发生的速度。

看到这里你能够会问,加入了nodelay参数以后的限速算法,到底算是哪一个“桶”,是漏桶算法还是令牌桶算法?固然还算是漏桶算法。斟酌一种情况,令牌桶算法的token为耗尽时会怎样做呢?由于它有一个请求行列,所以会把接下来的请求缓存下来,缓存几多受限于行列巨细。但此时缓存这些请求还成心义吗?假如server已经过载,缓存行列越来越长,RT越来越高,即使过了很久请求被处置了,对用户来说也没什么代价了。所以当token不够用时,最明智的做法就是间接拒绝用户的请求,这就成了漏桶算法。

四. 自界说返回值

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;
server {
location / {
limit_req zone=mylimit burst=4 nodelay;
limit_req_status 598;
}
}

默许情况下 没有设置 status 返回值的状态:




自界说 status 返回值的状态:




参考文档
nginx-proxy_pass官网
Full Example Configuration
Nginx限制拜候速度和最大并发毗连数模块–limit (避免DDOS进犯)
Nginx 限流
关于nginx的限速模块
Module ngx_http_limit_conn_module
Module ngx_http_limit_req_module
Nginx限速模块初探
限流算法

高端人脉微信群

高端人脉微信群

人脉=钱脉,我们相信天下没有聚不拢的人脉,扫码进群找到你所需的人脉,对接你所需的资源。

商业合作微信

商业合作微信

本站创始人微信,13年互联网营销经验,擅长引流裂变、商业模式、私域流量,高端人脉资源丰富。

精彩点评

相关推荐

平台大洗牌,被限流该怎么办?

平台大洗牌,被限流该怎么办?

最近平台大洗牌,评论区问最多的就是,如果被限流了该怎么办,今天就详细的解答这个问

降级-熔断-限流-傻傻分不清楚

降级-熔断-限流-傻傻分不清楚

1. 熔断1.1 熔断来源我们家用电闸上都有保险丝模块,当电压出现短路问题时,自动跳闸

血泪教训:小红书被限流怎么办?怎么恢复正常?

血泪教训:小红书被限流怎么办?怎么恢复正常?

很多新手小白刚开始运营小红书的时候,多半会经历很长一段数据低迷的情况。一方面,是

小红书无故被限流了??这里有你不知道的小红书限流小 ...

小红书无故被限流了??这里有你不知道的小红书限流小 ...

自从有消息爆出小红书内测直播功能之后,小红书成为了当下最受关注的平台之一。而正在

《抖音限流/降权/违规词手册》

《抖音限流/降权/违规词手册》

为了让更多小伙伴能够自己找到并解决【抖音限流】问题,今天为大家梳理一份抖音「限流

闲鱼被限流了,教你恢复元气

闲鱼被限流了,教你恢复元气

作者:咸鱼暴增系统很多朋友在使用小闲的时候都有可能碰到没有流量了,或者流量降低了

司马南为何被限流?多篇文章和视频下架!

司马南为何被限流?多篇文章和视频下架!

连续两天,灵灵看世界针对司马南污蔑、挑衅张文宏和陶斯亮提出质疑和批评,结果是:司

一文搞清楚限流、熔断和降级

一文搞清楚限流、熔断和降级

限流是对系统的被请求频率以及内部的部分功能的执行频率加以限制,防止因突发的流量激

作品播放量低,账号是不是被限流了,该怎么办呢?

作品播放量低,账号是不是被限流了,该怎么办呢?

前天我新发布的视频的播放量创历史了,有史以来最低的,你是不是也遇到过这样的情况?

一招判断自己的微头条是否被限流,被限流后,到底该怎么解决呢?

一招判断自己的微头条是否被限流,被限流后,到底该怎么解决呢?

对于一个自媒体创作者来说,辛辛苦苦创作的内容,发表后阅读量寥寥无几,那种心痛只有

阿里巴巴开源限流系统 Sentinel 全解析

阿里巴巴开源限流系统 Sentinel 全解析

今年下半年阿里开源了自研的限流系统 Sentinel,官方对 Sentinel 的介绍中用到了一系

展现量少怀疑被限流,打开它让你一看究竟,稍做修改也许爆了

展现量少怀疑被限流,打开它让你一看究竟,稍做修改也许爆了

不少友友顽强坚持,笔耕不辍,作品不少,但展现量不高,毕竟展现量才是根本,没有展现

文章被限流了怎么办?如何采取行动进行补救?我以昨天的文章为例

文章被限流了怎么办?如何采取行动进行补救?我以昨天的文章为例

文章被限流,是大家一直以来热议的一个话题,往往也只能表示无奈,没有任何办法,毕竟

第一批蹦迪选手已经“阳康”?武汉夜店开始限流了。

第一批蹦迪选手已经“阳康”?武汉夜店开始限流了。

月初我们找了22位知名的夜店老板做了一期专访,话题是关于“放开后夜店生意变好了吗?

如何判断账号是否被限流?没流量?赶紧查看这个地方

如何判断账号是否被限流?没流量?赶紧查看这个地方

只要查看一个地方,就可以知道你的账号是不是被限流了,好多朋友播放量突然间大幅度降

头条被限流可能是因为这几个原因,浅谈一下头条推荐机制

头条被限流可能是因为这几个原因,浅谈一下头条推荐机制

前段时间写了一篇文章刚发第一天没什么流量,突然第二天流量暴涨了,随之问题也跟着来

一篇文章说清楚头条“限流”那些事儿

一篇文章说清楚头条“限流”那些事儿

相信很多创作者都遇到辛苦写的微头条没有展现,也没有阅读量的情况,有些创作者知道这

抖音限流原因归纳总结与破解之道

抖音限流原因归纳总结与破解之道

2022年随着5G的来临,短视频作为目前最高阶最有效的信息展现方式,风口期必将持续不断

5种限流算法,7种限流方式,挡住突发流量?

5种限流算法,7种限流方式,挡住突发流量?

最近几年,随着微服务的流行,服务和服务之间的依赖越来越强,调用关系越来越复杂,服

主流的四种限流策略,我都可以通过redis实现

主流的四种限流策略,我都可以通过redis实现

引言在web开发中功能是基石,除了功能以外运维和防护就是重头戏了。因为在网站运行期

商业洽谈 文章投递 寻求报道
电话咨询: 15924191378
关注微信