nginx模块 ngx_http_limit_conn_module、ngx_http_limit_req_module

2018-07-18 09:38:13

ngx_http_limit_conn_module 模块用来控制客户端连接数,可以自定义一个 key作为客户端识别码。默认情况下 key 为客户端ip。

Syntax:	limit_conn zone number;
Default: —
Context: http, server, location

设置共享内存的区域 和 最大的连接数根据key。超过了报错。

limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
    location /download/ {
        limit_conn addr 1;
    }
}

上边代表每隔ip一次只能有1个连接。

limit_conn 指令可以有多个,比如。

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;
}

每个ip同时最多10个连接,同时,同一个虚拟主机最多只能有100个连接。

Syntax:	limit_conn_log_level info | notice | warn | error;
Default: limit_conn_log_level error;
Context: http, server, location

设置报错等级,如果报错了。

Syntax:	limit_conn_status code;
Default: limit_conn_status 503;
Context: http, server, location

设置错误码

Syntax:	limit_conn_zone key zone=name:size;
Default: —
Context: http

设置共享内存区域参数。key 可以是文本、变量、以及他们的组合。

比如下面设置 $binary_remote_addr 为内存区域的key,名称为 addr,分配10M内存。

limit_conn_zone $binary_remote_addr zone=addr:10m;


ngx_http_limit_req_module 模块是用来限制客户端请求频率的。

Syntax:	limit_req zone=name [burst=number] [nodelay];
Default: —
Context: http, server, location

burst 可以理解为等待被处理的排队数。比如我们设置了1秒只能有一个请求,如果把 burst 设置为5(没设置nodelay),那么当客户端一秒内发起5次请求,服务端不报错,而是按照1秒一个连续处理。

如果设置了 nodelay ,那么只要1秒内并发未超过 burst 设置的值,立马返回,不会延迟处理。

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

server {
    location /search/ {
        limit_req zone=one burst=5;
    }
}

上面配置的意思是 key 为客户端ip,zone名称为 one,速率为1秒一次请求,1秒内允许有5个并发,但是后面的4个请求会延迟处理。

同样,也支持多个 limit_req。

limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
limit_req_zone $server_name zone=perserver:10m rate=10r/s;

server {
    ...
    limit_req zone=perip burst=5 nodelay;
    limit_req zone=perserver burst=10;
}

限制ip的访问速率的同时,也限制同一个虚拟主机的请求速率。

Syntax:	limit_req_log_level info | notice | warn | error;
Default: limit_req_log_level error;
Context: http, server, location

设置错误日志的等级。

Syntax:	limit_req_status code;
Default: limit_req_status 503;
Context: http, server, location

设置状态码。

Syntax:	limit_req_zone key zone=name:size rate=rate;
Default: —
Context: http

定义共享内存区域参数。key 可以是文本、变量、以及他们的组合。

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

上面的配置定义了一个已客户端ip地址为 key,zone名为one,速率为每秒1次请求。

limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;

速率为0.5次每秒,也就是2秒只能有一个请求。


 备注

1.测试环境centos7 64位,nginx版本为 1.14.0。
2.读者也可以参考官方文档 nginx documentation
3..原文地址http://www.freecls.com/a/2712/c1


©著作权归作者所有
收藏
推荐阅读
简介
天降大任于斯人也,必先苦其心志。