HttpLimitReqest模块属于内置的核心模块,不需要额外的安装第三方模块。
进入nginx安装目录,输入:
cat auto/options | grep YES
即可查看内置的核心模块和第三方模块
如图上半部分为核心模块,下半部分为我们编译安装时./configure后面跟者安装的一些模块。
#请求模块
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
#连接模块
limit_conn_zone $binary_remote_addr zone=con_zone:10m;
而这两个模块就在内置模块中
1.请求模块 limit_req_zone
请求模块 限制某个ip的请求速度 ,如下面这段配置
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
定义了一个请求模块,这个模块名字为one,并开辟了10M的空间,用于记录binary_remote_addr ,rate=1r/s 限制对于同一ip的请求速率,限制平均速率为每秒只能请求一次,超过将返回对应的错误码。
然后在需要限制的location中使用该变量
location /mystatus {
stub_status on;
#limit_req zone=one;
#limit_req zone=one burst=3 nodelay;
}
location / {
root html;
index index.html index.htm;
limit_req zone=one;
#limit_req zone=one burst=3 nodelay;
#limit_conn con_zone 1;
#limit_conn perserver 2000;
}
如上我对 / 做了请求限制,经过我的测试疯狂访问 ip/ 时确实限制了请求,但是当我访问ip/mystatus路径时没有起到作用,按理说/mystatus也在/路径下应该也会做到限制,这就涉及到location 的一个匹配问题 详情看location指令。所有我们访问ip/mystatus是一个精确匹配,不会走下面的一个配置而是走的上面一个配置。所有没有产生效果。
如果使用limit_req zone=one burst=3 nodelay 这段配置 ,如果超过了rate这个速率 ,burst=3 此处配置表示为,设置一个大小为3的缓冲区,当有大量请求(爆发)过来时,访问超过了上面的限制可以先放到缓冲区内。意思3个请求将被放到缓冲区,而不是直接丢弃。
2.连接模块 limit_conn_zone
通俗的来讲就是限制每个用户连接到服务器的数量。而连接和请求的区别:连接这里涉及到tcp三次握手,握手成功好那么就会建立一个连接。在一次连接中,至少得有一次请求,意思说一次连接可以发送多次请求。
连接模块
定义连接模块变量:limit_conn_zone $binary_remote_addr zone=con_zone:10m;
然后再localtion中添加如下配置即可
limit_conn con_zone 1; 限制某个ip的连接数量
limit_conn perserver 2000; 限制服务器最大连接数量
除了limit_conn perserver 2000;以上配置都是针对的某个ip进行限制而不是全局进行一个请求限制