0%

ngx_http_limit_conn模块和ngx_http_limit_req模块

http_limit_conn模块

限制每个key同一时间的连接数,比如限制每个IP地址的连接数。限制是对于所有worer进程都生效,所以配置需要放在共享内存中。

常用指令

1. limit_conn_zone
1
2
3
Syntax:  limit_conn_zone key zone=name:size;
Default: —
Context: http

申请一块共享内存存储不同的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
2
3
Syntax:	 limit_conn zone number;
Default: —
Context: http, server, location

配置使用的共享内存zone的名称,并指定conn的连接限制次数,超过限制,默认返回503。比如:

1
2
3
4
5
6
limit_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
8
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;
}

3.limit_conn_dry_run
1
2
3
Syntax:  limit_conn_dry_run on | off;
Default: limit_conn_dry_run off;
Context: http, server, location

空运行模式。当开启空运行模式,连接次数不被限制,但是共享内存中仍然会记录连接个数。

4. limit_conn_log_level
1
2
3
Syntax: limit_conn_log_level info | notice | warn | error;
Default: limit_conn_log_level error;
Context: http, server, location

修改被限制连接的日志级别,默认为error。

5. limit_conn_status
1
2
3
Syntax:	 limit_conn_status code;
Default: limit_conn_status 503;
Context: http, server, location

被限制的连接默认返回503,也可通过该条指令修改返回http code。

变量

  • $limit_conn_status 保存限制连接数的结果

http_limit_req模块

http_limit_conn用于限制指定key时间段内的请求数,基于漏桶(leaky bucket)算法实现。限制是对于所有worer进程都生效,所以配置需要放在共享内存中。

常用指令

1. limit_req_zone
1
2
3
Syntax:	 limit_req_zone key zone=name:size rate=rate [sync];
Default: —
Context: http

申请一块共享内存存储不同的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
2
3
Syntax: limit_req zone=name [burst=number] [nodelay | delay=number];
Default: —
Context: http, server, location

配置使用共享内存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
2
3
Syntax:	 limit_req_dry_run on | off;
Default: limit_req_dry_run off;
Context: http, server, location

空运行模式。当开启空运行模式,处理请求数不被限制,但是共享内存中仍然会记录请求个数。

4. limit_req_log_level
1
2
3
Syntax:	 limit_req_log_level info | notice | warn | error;
Default: limit_req_log_level error;
Context: http, server, location

修改被限制请求的日志级别,默认为error。

5. limit_req_status
1
2
3
Syntax:	 limit_req_status code;
Default: limit_req_status 503;
Context: http, server, location

被限制的请求默认返回503,也可通过该条指令修改返回http code。

http_limit_req vs http_limit_conn

http_limit_reqhttp_limit_conn同时触发时,http_limit_req优先生效。

注意

realod 并不会清空共享内存中已统计的次数

参考