dynamic_limit_req_zone
`dynamic_limit_req_zone` 指令配置一个共享内存区域,用于跟踪并限制每个 IP 地址或特定 key 的过高请求速率。
说明
dynamic_limit_req_zone 指令是 ngx_dynamic_limit_req_module 的一个关键组件,用于动态管理 IP 的请求速率并防止滥用。它建立了一个共享内存区域,用来保存指定 key 的当前请求速率状态,从而使 NGINX 能够控制单个客户端向服务器发起请求的频率。
该指令接受多个参数:
- key:指定用于跟踪请求的键,可以是文本和变量的组合(例如,$binary_remote_addr 可用于基于客户端 IP 的跟踪)。
- zone=name:size:定义共享内存区域的名称和大小;name 是标识符,size 指定分配的内存量(例如,5m 表示 5 兆字节)。
- rate=rate:设定该 key 的最大请求速率(以每秒请求数为单位),以 0.001 请求/秒 为最小单位表示的整数(例如,5r/m 表示每分钟 5 次请求)。
- sync:可选标志,启用进程间同步。
- redis=address:指定用于将请求状态外部存储的 Redis 服务器地址。
- block_second=time:定义超出允许速率后应阻止某个 IP 的时间长度(以秒为单位)。
总体而言,dynamic_limit_req_zone 通过控制请求流并根据流量模式进行动态调整,帮助缓解诸如 DDoS 攻击等问题。
配置示例
dynamic_limit_req_zone $binary_remote_addr zone=sms:10m rate=10r/s redis=127.0.0.1 block_second=600;
确保 Redis 服务器正在运行并且可被 NGINX 访问,否则该指令将无法按预期工作。
如果共享内存大小过小,可能导致无法充分跟踪并发请求,从而造成请求限制的错误计算。
如果使用 redis 选项,请记得正确配置 Redis 参数;缺失或错误的设置可能导致请求速率跟踪失败。