模块 ngx_http_limit_req_module

示例配置
指令
     limit_req
     limit_req_dry_run
     limit_req_log_level
     limit_req_status
     limit_req_zone
嵌入变量

模块 ngx_http_limit_req_module (0.7.21)用于限制每个定义的键的请求处理速率,特别是来自单个 IP 地址的请求的处理速率。使用“漏桶”方法进行限制。

示例配置

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

    ...

    server {

        ...

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

指令

语法: limit_req zone=名称 [burst=数字] [nodelay | delay=数字];
默认值:
上下文: http, server, location

设置共享内存区域和请求的最大突发大小。如果请求速率超过区域配置的速率,则其处理将延迟,以便请求以定义的速率进行处理。过多的请求将被延迟,直到其数量超过最大突发大小,此时请求将以错误终止。默认情况下,最大突发大小等于零。例如,以下指令

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

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

每秒平均不允许超过 1 个请求,突发请求不超过 5 个。

如果在限制请求的同时不希望延迟过多的请求,则应使用参数 nodelay

limit_req zone=one burst=5 nodelay;

参数 delay(1.15.7)指定了过多的请求变得延迟的限制。默认值为零,即所有过多的请求都会延迟。

可以有多个 limit_req 指令。例如,以下配置将限制来自单个 IP 地址的请求处理速率,并且同时限制虚拟服务器的请求处理速率:

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

如果在当前级别未定义 limit_req 指令,则这些指令会从前一个配置级别继承。

语法: limit_req_dry_run on | off;
默认值:
limit_req_dry_run off;
上下文: http, server, location

该指令出现在版本 1.17.1 中。

启用干运行模式。在此模式下,不限制请求处理速率,但在共享内存区域中,过多请求的数量仍然按照通常方式计算。

语法: limit_req_log_level info | notice | warn | error;
默认值:
limit_req_log_level error;
上下文: http, server, location

该指令出现在版本0.8.18中。

设置服务器拒绝处理请求的速率超过时,或延迟请求处理时的所需日志记录级别。延迟的日志级别比拒绝的日志级别低一点;例如,如果指定了“limit_req_log_level notice”,则使用 info 级别记录延迟。

语法: limit_req_status code;
默认值:
limit_req_status 503;
上下文: http, server, location

该指令出现在版本1.3.15中。

设置拒绝请求时返回的状态码。

语法: limit_req_zone key zone=name:size rate=rate [sync];
默认值:
上下文: http

设置一个共享内存区域的参数,该区域将保存各种键的状态。特别是,状态存储当前的过量请求数量。 key 可以包含文本、变量及其组合。键值为空的请求不会被计算。

在版本1.7.6之前,一个 key 只能包含一个变量。

使用示例:

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

在这里,状态保存在一个10兆字节的区域“one”中,该区域的平均请求处理速率不能超过每秒1个请求。

客户端IP地址作为一个键。请注意,这里使用的是 $binary_remote_addr 变量,而不是 $remote_addr。对于IPv4地址,$binary_remote_addr 变量的大小始终为4字节,对于IPv6地址,始终为16字节。存储的状态在32位平台上总是占用64字节,在64位平台上总是占用128字节。一个兆字节的区域可以保存约16千个64字节的状态,或者约8千个128字节的状态。

如果区域存储已耗尽,则删除最近未使用的状态。如果即使在这之后也不能创建新的状态,则请求将以错误结束。

速率以每秒请求(r/s)指定。如果希望速率小于每秒一个请求,则以每分钟请求(r/m)指定。例如,半请求每秒为30r/m。

sync 参数(1.15.3)启用共享内存区域的同步

sync 参数是作为我们的商业订阅的一部分提供的。

另外,作为我们的商业订阅的一部分,自1.17.7起,可以使用API获取或重置每个共享内存区域的状态信息

嵌入式变量

$limit_req_status
保留请求处理速率限制的结果 (1.17.6): 通过, 延迟, 拒绝, 延迟模拟运行, 或 拒绝模拟运行