dynamic_limit_req

dynamic_limit_req 指令控制传入请求的速率,以根据请求模式动态锁定 IP 来防止滥用。

语法dynamic_limit_req zone=name [burst=number] [nodelay | delay=number];
默认值none
上下文http, server, location, if in location
参数1-3

说明

dynamic_limit_req 指令是 ngx_dynamic_limit_req_module 的一部分,用于动态管理每个 IP address 的请求速率。该指令通过定义一个速率限制来有效减轻潜在滥用,对超过指定阈值的请求进行限速。它维护一个 shared memory zone 来跟踪状态信息,包括不同键(例如 IP addresses)当前的超额请求计数。当请求超过允许的请求速率时,模块会对超额请求实施延迟(如果未指定 nodelay),在处理前将这些请求暂缓。如果超额请求数量超过 burst 阈值,它们也可以被直接拒绝,返回配置的 HTTP status code 响应,从而确保只有符合定义限制的请求能够及时被处理。

该指令支持三个参数:指定的 shared memory zone、可选的 burst 参数(用于指定突发请求的最大数量),以及可选的 delay 参数(用于设置对超出速率限制的请求的具体延迟)。这种灵活性允许实现复杂的速率限制策略,从而在确保用户公平性的同时显著提高服务可用性。

配置示例

http { 
    dynamic_limit_req_zone $binary_remote_addr zone=my_limit:10m rate=5r/s; 
    server { 
        location /api { 
            dynamic_limit_req zone=my_limit burst=10; 
        } 
    } 
}

确保已使用 dynamic_limit_req_zone 指令定义了指定的共享内存区域。

burst 和 rate 的错误配置可能导致不必要的限流或无法充分防护滥用行为。

delay 设置可能使请求处理更复杂,如果未正确监控,可能导致用户的延迟增加。

← 返回所有指令