http_limit_conn模块
限制每个key同一时间的连接数,比如限制每个IP地址的连接数。限制是对于所有worer进程都生效,所以配置需要放在共享内存中。
常用指令
1. limit_conn_zone
1 | Syntax: limit_conn_zone key zone=name:size; |
申请一块共享内存存储不同的key及对应的连接数,key可以是文本、变量或者是两者的结合。比如:1
limit_conn_zone $binary_remote_addr zone=addr:10m;
声明一块10M大小的共享内存,命名为addr,用$binary_remote_addr
做key。
注:$binary_remote_addr
为客户端地址的二进制格式,比$remote_addr
效率更高,占用空间更小。
2. limit_conn
1 | Syntax: limit_conn zone number; |
配置使用的共享内存zone的名称,并指定conn的连接限制次数,超过限制,默认返回503。比如:1
2
3
4
5
6limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location /download/ {
limit_conn addr 1;
}
limit为1,同一时间只有一个连接可以访问/download/
。
对于不同的key,可以同时设置多个限制条件,比如:1
2
3
4
5
6
7
8limit_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;
}
3.limit_conn_dry_run
1 | Syntax: limit_conn_dry_run on | off; |
空运行模式。当开启空运行模式,连接次数不被限制,但是共享内存中仍然会记录连接个数。
4. limit_conn_log_level
1 | Syntax: limit_conn_log_level info | notice | warn | error; |
修改被限制连接的日志级别,默认为error。
5. limit_conn_status
1 | Syntax: limit_conn_status code; |
被限制的连接默认返回503,也可通过该条指令修改返回http code。
变量
$limit_conn_status
保存限制连接数的结果
http_limit_req模块
http_limit_conn
用于限制指定key时间段内的请求数,基于漏桶(leaky bucket)算法实现。限制是对于所有worer进程都生效,所以配置需要放在共享内存中。
常用指令
1. limit_req_zone
1 | Syntax: limit_req_zone key zone=name:size rate=rate [sync]; |
申请一块共享内存存储不同的key及其请求数,key可以是文本、变量或者是两者的结合。并配置限制速率。比如:1
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
申请一块大小为10M的共享内存,命名为one。用$binary_remote_addr
做key,限制速率是每秒处理1个请求。
2. limit_req
1 | Syntax: limit_req zone=name [burst=number] [nodelay | delay=number]; |
配置使用共享内存zone的名称,同时可以配置漏桶相关参数。参数配置如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14# 每分钟处理6条请求,即10s处理一条
limit_req_zone $binary_remote_addr zone=one:10m rate=6r/m;
# 基本配置,10s处理一条请求,多余请求默认直接返回503
limit_req zone=one;
# 基于漏桶算法,10s内到来的第1条请求正常处理,2、3、4条请求延迟处理,不会返回503,每过10s处理一个,直到处理完。4条以后的请求直接返回503
limit_req zone=one burst=3;
# delay用于设置被延迟处理请求个数。第1、2、3条请求立即处理,第3、4条请求延迟处理,不会返回503,每过10s处理一个,4条以后的请求直接返回503
limit_req zone=one burst=3 delay=2;
# 不会延迟处理,前4条请求直接被处理,第4条请求之后返回503
limit_req zone=one burst=3 nodelay;
3. limit_req_dry_run
1 | Syntax: limit_req_dry_run on | off; |
空运行模式。当开启空运行模式,处理请求数不被限制,但是共享内存中仍然会记录请求个数。
4. limit_req_log_level
1 | Syntax: limit_req_log_level info | notice | warn | error; |
修改被限制请求的日志级别,默认为error。
5. limit_req_status
1 | Syntax: limit_req_status code; |
被限制的请求默认返回503,也可通过该条指令修改返回http code。
http_limit_req vs http_limit_conn
当http_limit_req
、http_limit_conn
同时触发时,http_limit_req
优先生效。
注意
realod 并不会清空共享内存中已统计的次数