Nginx下limit_req模块burst参数超详细解析
- 暂时拦截住上方水的向下流动,等待桶中的一部分水漏走后,再放行上方水。
- 溢出的上方水直接抛弃。
//src/http/modules/ngx_http_limit_req_module.c:396
ms = (ngx_msec_int_t) (now - lr->last);
excess = lr->excess - ctx->rate * ngx_abs(ms) / 1000 + 1000;
if (excess < 0) {
excess = 0;
}
*ep = excess;
if ((ngx_uint_t) excess > limit->burst) {
return NGX_BUSY;
}
if (account) {
lr->excess = excess;
lr->last = now;
return NGX_OK;
}
- $binary_remote_addr :表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址
- zone=one:10m:表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频次信息
- rate=1r/s:表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,即每秒只处理一个请求,还可以有比如30r/m的,即限制每2秒访问一次,即每2秒才处理一个请求。
- zone=one :设置使用哪个配置区域来做限制,与上面limit_req_zone 里的name对应
- burst=5:重点说明一下这个配置,burst爆发的意思,这个配置的意思是设置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内等待,但是这个等待区里的位置只有5个,超过的请求会直接报503的错误然后返回。
- nodelay:
- 如果设置,会在瞬时提供处理(burst + rate)个请求的能力,请求超过(burst + rate)的时候就会直接返回503,永远不存在请求需要等待的情况。(这里的rate的单位是:r/s)
- 如果没有设置,则所有请求会依次等待排队
- 假如用户配置的平均发送速率为10r/s,则每隔0.1秒一个令牌被加入到桶中;
- 假设桶最多可以存发b个令牌。如果令牌到达时令牌桶已经满了,那么这个令牌会被丢弃;
- 当一个n个字节的数据包到达时,就从令牌桶中删除n个令牌,并且数据包被发送到网络;
- 如果令牌桶中少于n个令牌,那么不会删除令牌,并且认为这个数据包在流量限制之外;
- 算法允许最长b个字节的突发,但从长期运行结果看,数据包的速率被限制成常量r。对于在流量限制外的数据包可以以不同的方式处理:
- 它们可以被丢弃;
- 它们可以排放在队列中以便当令牌桶中累积了足够多的令牌时再传输;
- 它们可以继续发送,但需要做特殊标记,网络过载的时候将这些特殊标记的包丢弃。


- 查看当前的tcp连接数
- netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
- 结果如下:

-
- ab压测工具瞬间返回了结果
- 可以看到一共10个请求,9个请求都失败了。且0.09秒就完成了压测
- 接着查看当前的tcp连接数:
可以观察到此时服务端的TIME_WAIT 为10,这意味着是服务端主动要求断开了所有TCP连接
- 接着再查看 /var/log/nginx/access.log,印证了只有一个请求成功了,其它就是都直接返回了503,即服务器拒绝了请求。

- 查看当前的tcp连接数
- netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
- 结果如下:

- 使用ab测试工具,发起10个并发请求:
- ab -n 10 -c 10 url
- 可以看到测试经过30 s 才结束
- 压测中一共10个请求,有4个请求失败了,直接返回了503
- 查看当前的tcp连接数
- 上图是ab测试第一秒时的截图,TIME_WAIT=5 表示有服务器端主动断开了5个TCP连接,即5个请求被瞬时拒绝,同时ESTABLISHED的数量由23增加到28,即建立了5个TCP连接
- 上图是ab测试过程中的截图,TIME_WAIT=7 表示有服务器端主动断开了7个TCP连接,增加的2个TIME_WAIT是因为有2个在缓存队列的请求被处理完毕了,所以断开了连接。
- 上图是ab测试第一秒时的截图,TIME_WAIT=5 表示有服务器端主动断开了5个TCP连接,即5个请求被瞬时拒绝,同时ESTABLISHED的数量由23增加到28,即建立了5个TCP连接
- 接着查看 /var/log/nginx/access.log日志
- 可以观察到在39分35秒,即压测第1秒时,成功处理了1个请求,另外有4个请求瞬间返回了503,剩下的5个请求每隔6s处理一次。
- 这是因为设置了burst=5,在服务器接收到10个并发请求后,先处理1个请求,同时将5个请求放入burst缓冲队列中,等待处理。而超过(burst+1)数量的请求就被直接抛弃了,即直接抛弃了4个请求。
- 查看 /var/log/nginx/error.log日志
- 发现有5个delaying request,4个limiting request

- 查看当前的tcp连接数
- netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
- 结果如下:

- 使用ab测试工具,发起10个并发请求:
- ab -n 10 -c 10 url
- 可以看到压测在0.1 s 内完成了,这也是添加nodelay参数的意义
- 压测中一共10个请求,有4个请求失败了,直接返回了503
- 查看当前的tcp连接数:所有的请求都在1s内处理完成了
- 接着查看 /var/log/nginx/access.log日志
- 可以发现在1s内,服务器端处理了6个请求(峰值速度:burst+原来的处理速度)。对于剩下的4个请求,直接返回503,在下一秒如果继续向服务端发送10个请求,服务端会直接拒绝这10个请求并返回503。因为设定了没6s处理1个请求,所以直到30 s 之后,才可以再处理一个请求,即如果此时向服务端发送10个请求,会返回9个503,一个200
- 查看/var/log/nginx/error.log日志,发现有4个请求被直接拒绝了,没有延时请求。
- limit_req zone=req_zone;
- 严格依照在limti_req_zone中配置的rate来处理请求
- 超过rate处理能力范围的,直接drop
- 表现为对收到的请求无延时
- limit_req zone=req_zone burst=5;
- 依照在limti_req_zone中配置的rate来处理请求
- 同时设置了一个大小为5的缓冲队列,在缓冲队列中的请求会等待慢慢处理
- 超过了burst缓冲队列长度和rate处理能力的请求被直接丢弃
- 表现为对收到的请求有延时
- limit_req zone=req_zone burst=5 nodelay;
- 依照在limti_req_zone中配置的rate来处理请求
- 同时设置了一个大小为5的缓冲队列,当请求到来时,会爆发出一个峰值处理能力,对于峰值处理数量之外的请求,直接丢弃
- 在完成峰值请求之后,缓冲队列不能再放入请求。如果rate=10r/s,且这段时间内没有请求再到来,则每6 s 缓冲队列就能回复一个缓冲请求的能力,直到回复到能缓冲5个请求位置。
<div class="p4course_target"><div class="_4paradigm_box clearfix T0" data-track-view="{"mod":"popu_647","con":",https://nbrecsys.4paradigm.com/api/v0/csdn/sample-t0?stage=1&requestID=rdCAdad8&userID=kCwpvOvOuF&itemID=187&url=https%3A%2F%2Fclick.hm.baidu.com%2Fclk%3Ff901be555c928b0c1c5f88784de84e1c,"}" data-track-click="{"mod":"popu_647","con":",https://nbrecsys.4paradigm.com/api/v0/csdn/sample-t0?stage=1&requestID=rdCAdad8&userID=kCwpvOvOuF&itemID=187&url=https%3A%2F%2Fclick.hm.baidu.com%2Fclk%3Ff901be555c928b0c1c5f88784de84e1c,"}"><a href="https://nbrecsys.4paradigm.com/api/v0/csdn/sample-t0?stage=1&requestID=rdCAdad8&userID=kCwpvOvOuF&itemID=187&url=https%3A%2F%2Fclick.hm.baidu.com%2Fclk%3Ff901be555c928b0c1c5f88784de84e1c" target="_blank"><div class="content-box"><h4 class="text-truncate oneline">30W<span style="color:#ca0c16;">年薪</span>的<span style="color:#ca0c16;">人工智能</span>工程师只是“白菜价”?</h4><p class="content ">人工智能技术向前发展,也必然会出现一些岗位被人工智能取代,但我们相信,随着人工智能的发展,会有更多的新的、属于未来的工作岗位出现,是社会发展的必然产物,我们能做的也许只能是与时俱进了</p></div></a></div></div><script>window.p4sdk_enable_courseBox=true</script> <a id="commentBox"></a>

- Edwin19911212: 感觉写的很好,而且有理有据 (09-25 19:56 #1楼) 删除举报回复
- 上一页
- 1
- 下一页
Nginx使用limit_req_zone对同一IP访问进行限流
keketrtr
07-18 8004
nginx可以使用ngx_http_limit_req_module模块的limit_req_zone指令进行限流访问,防止用户恶意攻击刷爆服务器。ngx_http_limit_req_module模...
nginx配置limit_req限制ip访问速率详解
tjcyjd
09-10 4668
1、漏桶原理 漏桶原理是什么呢?我们可以从字面上简单的理解,就是有一个桶,它的体积是固定的,桶底下有一个小洞会不停的漏水出去,而桶的上方有个水龙头,也不停的往桶里灌水。 假设我们这个桶的体积是1L,小...
<div class="recommend-item-box recommend-box-ident type_blog clearfix" data-track-view="{"mod":"popu_387","con":",https://blog.youkuaiyun.com/weixin_29135773/article/details/60764426,BlogCommendFromBaidu_2,index_2"}" data-track-click="{"mod":"popu_387","con":",https://blog.youkuaiyun.com/weixin_29135773/article/details/60764426,BlogCommendFromBaidu_2,index_2"}" data-flg="true">
<a href="https://blog.youkuaiyun.com/weixin_29135773/article/details/60764426" target="_blank" title="Nginx限制访问速率和最大并发连接数模块--limit (防止DDOS攻击)">
<div class="content" style="width: 702px;">
<h4 class="text-truncate oneline" style="width: 589px;">
<em>Nginx</em>限制访问速率和最大并发连接数<em>模块</em>--limit (防止DDOS攻击) </h4>
<div class="info-box d-flex align-content-center">
<p class="avatar">
<img src="https://avatar.youkuaiyun.com/4/6/9/3_weixin_29135773.jpg" alt="weixin_29135773" class="avatar-pic">
<span class="namebox" style="left: -46.5px;">
<span class="name">weixin_29135773</span>
<span class="triangle"></span>
</span>
</p>
<p class="date-and-readNum">
<span class="date hover-show">03-07</span>
<span class="read-num hover-hide">
<svg class="icon csdnc-yuedushu" aria-hidden="true">
<use xlink:href="#csdnc-yuedushu"></use>
</svg>
1万</span>
</p>
</div>
<p class="content oneline" style="width: 702px;">
Nginx限制访问速率和最大并发连接数模块–limit (防止DDOS攻击) </p>
</div>
</a>
</div>
<div class="recommend-item-box recommend-box-ident type_blog clearfix" data-track-view="{"mod":"popu_387","con":",https://blog.youkuaiyun.com/loophome/article/details/50767907,BlogCommendFromBaidu_3,index_3"}" data-track-click="{"mod":"popu_387","con":",https://blog.youkuaiyun.com/loophome/article/details/50767907,BlogCommendFromBaidu_3,index_3"}" data-flg="true">
<a href="https://blog.youkuaiyun.com/loophome/article/details/50767907" target="_blank" title="Nginx模块 ngx_http_limit_req_module 限制请求速率">
<div class="content" style="width: 702px;">
<h4 class="text-truncate oneline" style="width: 579px;">
<em>Nginx</em><em>模块</em> ngx_http_<em>limit_req</em>_module 限制请求速率 </h4>
<div class="info-box d-flex align-content-center">
<p class="avatar">
<img src="https://avatar.youkuaiyun.com/7/2/0/3_loophome.jpg" alt="loophome" class="avatar-pic">
<span class="namebox" style="left: -26.5px;">
<span class="name">loophome</span>
<span class="triangle"></span>
</span>
</p>
<p class="date-and-readNum">
<span class="date hover-show">02-29</span>
<span class="read-num hover-hide">
<svg class="icon csdnc-yuedushu" aria-hidden="true">
<use xlink:href="#csdnc-yuedushu"></use>
</svg>
5090</span>
</p>
</div>
<p class="content oneline" style="width: 702px;">
The ngx_http_limit_req_module module (0.7.21) is used to limit the request processing rate per a def... </p>
</div>
</a>
</div>
<div class="recommend-item-box recommend-box-ident type_blog clearfix" data-track-view="{"mod":"popu_387","con":",https://blog.youkuaiyun.com/evsqiezi/article/details/51810129,BlogCommendFromBaidu_4,index_4"}" data-track-click="{"mod":"popu_387","con":",https://blog.youkuaiyun.com/evsqiezi/article/details/51810129,BlogCommendFromBaidu_4,index_4"}" data-flg="true">
<a href="https://blog.youkuaiyun.com/evsqiezi/article/details/51810129" target="_blank" title="nginx之ngx_http_limit_req">
<div class="content" style="width: 702px;">
<h4 class="text-truncate oneline" style="width: 587px;">
<em>nginx</em>之ngx_http_<em>limit_req</em> </h4>
<div class="info-box d-flex align-content-center">
<p class="avatar">
<img src="https://avatar.youkuaiyun.com/D/0/5/3_evsqiezi.jpg" alt="evsqiezi" class="avatar-pic">
<span class="namebox" style="left: -21.5px;">
<span class="name">evsqiezi</span>
<span class="triangle"></span>
</span>
</p>
<p class="date-and-readNum">
<span class="date hover-show">07-02</span>
<span class="read-num hover-hide">
<svg class="icon csdnc-yuedushu" aria-hidden="true">
<use xlink:href="#csdnc-yuedushu"></use>
</svg>
849</span>
</p>
</div>
<p class="content oneline" style="width: 702px;">
配置
http{
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
location…
nginx限制请求数(ngx_http_limit_req_module) 实现详解
huzilinitachi
03-26
241
nginx ngx_http_limit_req_module可以实现限制请求IP单位时间内的请求次数的作用。限制请求数能一定程度上降低nginx以及nginx作为代理时对恶意的请求访问压力。同…
nginx 上有两个限制连接的模块一个是 limit_zone 另一个是 limie_req_z…
nginx限制请求数(ngx_http_limit_reqmodule)模块
wanglei_storage
04-06
2332
上一篇文章主要写nginx限制连接数ngx_http_limit_conn_module 模块的作用及使用方法,下面来写ngx_http_limit_req_module模块的作用及使用。通过ngx…
Syntax: limit_req_whitelist geo_var_name=var_name geo_var_value=var_value
Default: -
…
下面方法可以防止黑客知道你的源服务器真实IP进行并发攻击,通常只需要…
<div class="recommend-loading-box">
<img src="https://csdnimg.cn/release/phoenix/images/feedLoading.gif">
</div>
<div class="recommend-end-box">
<p class="text-center">没有更多推荐了,<a href="https://blog.youkuaiyun.com/" class="c-blue c-blue-hover c-blue-focus">返回首页</a></p>
</div>
</div>
</main>