dynamic_limit_req
dynamic_limit_req 指令控制传入请求的速率,以根据请求模式动态锁定 IP 来防止滥用。
NGINX module to dynamically lock IP and release it periodically
·
httpserverlocationif in location
语法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 设置可能使请求处理更复杂,如果未正确监控,可能导致用户的延迟增加。