概述
上篇我们分析了NGINX速率限制的原理,本篇我们继续分析NGINX并发限制的原理,后面一篇,我们继续分析NGINX带宽限制的原理。
速率限制用来限制单个客户端在单位时间的请求数目,而并发限制用来限制同一时间的连接总数。本篇文章我们对并发限制功能的原理和源代码进行分析,从而可以更好地理解和使用此功能。
原理
并发限制实现原理相对简单。它像速率限制那样需要采用漏桶或者令牌头算法进行流量的控制和整形。它只需维护一个计数表示当前的连接数,然后在建立连接时增加计数,连接断开时减少计数。当新的连接到来时比较当前计数和配置参数的大小关系就可以决定是否可以建立连接。
配置语法
NGINX通过limit_conn_zone和limit_conn两条指令来实现并发限制。指令limit_conn_zone定义了并发限制的参数,指令limit_conn在所在的location使能并发限制。
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
...
server {
...
location /download/ {
limit_conn addr 1;
}
}
指令limit_conn_zone
配置语法:
Syntax: limit_conn_zone key zone=name:;
Default: —
Context: http
参数key定义了基于什么样的参数进行速率控制。比如下面的例子中的$binary_remote_addr就是表示使用客户端的ip地址(remote_addr)进行速率控制。而且为了节省存储空间采用了二进制的方式表示。
参数zone定义一块共享内存区域。此共享区域用来存储各种key相关的状态信息特别是当前的连接数。参数key可以包含text,变量或者是他们的组合,但是不能为空。因为采用了共享内存的方式(关于NGINX共享内存可以参考这篇文章),所以,这些信息被所有的worker进程共用。
通过此参数可以定义共享内存的名字和大小。在上述采用$binary_remote_addr作为key的例子中,所需要的存储空间比速率控制所需要的空间要少,所以在此配置下,相同大小的内存存储的节点数目要把速率控制的节点数目多。

最低0.47元/天 解锁文章
1182

被折叠的 条评论
为什么被折叠?



