对于Nginx接入层限流可以使用Nginx自带的两个模块:连接数限制模块(ngx_http_limit_conn_module和 漏桶算法实现的请求限流模块ngx_http_limit_req_module。
limit_conn用来对某个key对应的总的网络连接数进行限流,可以按照IP、域名维度进行限流。limit_req用来对某个key对应的请求的平均速率进行限流,两种方法:
limit_conn 是对某个key对应的总的网络连接数进行限流。可以按照IP来限制IP维度的总连接数,或者按照服务域名 来限制某个域名的总连接数。
该模块提供了两个配置参数,liit_conn_zone 和 limit_conn,其中limit_conn_zone 只能配置在http{}段,而limit_conn则可以配置与http{},server{},location{}区段中。
# ./configure –prefix=/usr/local/nginx –-add-module=./nginx_limit_speed_module-master
# make
输入make进行编译,千万不要make install 因为会覆盖原来已经安装好的内容,另外,编译必须没错误才行。
输入 /usr/local/nginx/sbin/nginx -V,查看ngx_cache_purge是否安装成功。
语法:limit_req_zone $variable zone=name:size rate=rate;
默认值: none
配置段: http
说明:
- $variable 定义键
- zone=name 定义区域名称,后面的limit_conn指令会使用到
- size: 定义各个键共享内存空间大小
例:
limit_req_zone $binary_remote_addr zone=addr:10m rate=1r/s;
客户端的IP地址作为键。注意 使用的是binary_remote_addr 变量,而不是 remoteaddr变量。− r e m o t e a d d r 变 量 。 − remote_addr变量的长度为7字节到15字节,而存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。
- $binary_remote_addr变量的长度是固定的4字节,存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。
1M共享空间可以保存3.2万个32位的状态,1.6万个64位的状态。
如果共享内存空间被耗尽,服务器将会对后续所有的请求返回 503 (Service Temporarily Unavailable) 错误。
语法: limit_conn_log_level info | notice | warn | error
默认值: error
配置段:http,server,location
当达到最大限制连接数后,记录日志的等级。
语法: limit_conn zone_name number
默认值: none
配置段: http,server,location
指定每个给定键值的最大同时连接数,当超过这个数字时被返回503.如
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location /www.ttlsa.com/ {
limit_conn addr 1;
}
}
同一IP同一时间只允许有一个连接
当多个 limit_conn 指令被配置时,所有的连接数限制都会生效。比如,下面配置不仅会限制单一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_status code;
默认值: limit_conn_status 503;
配置段: http, server, location
该指定在1.3.15版本引入的。指定当超过限制时,返回的状态码。默认是503。
语法: limit_rate rate
默认值:0
配置段 :http, server, location, if in location
对每个连接的速率限制。参数rate的单位是字节/秒,设置为0将关闭限速。 按连接限速而不是按IP限制,因此如果某个客户端同时开启了两个连接,那么客户端的整体速率是这条指令设置值的2倍。
http {
limit_conn_zone $binary_remote_addr zone=limit:10m;
limit_conn_log_level info;
server {
location ^~ /download/ {
limit_conn limit 4;
limit_rate 200k;
}
}
}
1、请求进入后首先判断当前limit_conn_zone中相应key的连接数是否超出配置的最大连接数
2、如果超过了配置的最大大小,则被限流,返回limit_conn_status定义的错误状态码。否则相应的key的连接数加1,并注册请求处理完成的回调函数。
3、进行请求处理
4、在技术请求阶段调用注册的回调函数对相应 key的连接数减1。
limit_req 是 漏桶算法实现,对于 指定的key对应的请求进行限流,比如:
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
...
location /limit {
limit_req zone=one burst=5 nodelay;
}
参数说明:
limit_req_zone:
limit_req:
limit_req
的主要执行过程如下