nginx 通过 map 指令按 ip 分组打标,为每组独立配置 limit_req_zone 实现差异化限流;location 中用 limit_req zone=$partner_key 动态调用对应策略,并通过 $limit_req_status 日志字段观测限流状态。

Linux 下用 Nginx 的 limit_req 对不同 IP 实现独立限流,关键不是给每个 IP 单独写一条规则,而是用 map 指令做分类映射,再为每类分配专属限流区域(zone),让各 IP 组互不干扰。
用 map 将 IP 分组打标
在 http 块中定义映射关系,把需要差异化对待的 IP 或网段归到不同 partner 标识下:
- 支持 IPv4 和 IPv6,也支持 CIDR 写法(如
192.168.10.0/24) - 未匹配的 IP 走
default,避免漏控 - 配置可热重载,改完执行
nginx -s reload即生效
示例:
map $remote_addr $partner_key {default "default";
192.168.10.5 "partner_a";
203.0.113.22 "partner_b";
2001:db8::1 "partner_a";
192.168.20.0/24 "partner_c";
}
为每组定义独立限流 zone
每个 partner_key 值对应一个 limit_req_zone,key 必须统一用 $partner_key,zone 名称要和 key 值一致(如 partner_a):
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- rate 值按业务等级设置:核心伙伴可设 50r/s,普通伙伴设 5r/s,default 设 1r/s
- 内存大小(如
10m)按预估最大并发 partner 数预留,每条记录约占用 64 字节 - zone 名称必须唯一,不能重复
示例:
limit_req_zone $partner_key zone=partner_a:10m rate=50r/s;limit_req_zone $partner_key zone=partner_b:10m rate=5r/s;
limit_req_zone $partner_key zone=partner_c:10m rate=10r/s;
limit_req_zone $partner_key zone=default:10m rate=1r/s;
在 location 中动态调用限流策略
在反向代理或 API 路径的 location 块里,直接用变量引用 zone:
-
limit_req zone=$partner_key burst=20 nodelay;—— Nginx 会自动查找与当前 $partner_key 值同名的 zone - 对高优 partner 可加
nodelay避免排队延迟;对低配额 partner 可设小 burst(如 5~10)防洪峰穿透 - 确保该指令写在
proxy_pass之前,否则被限流的请求仍可能触发后端
验证与可观测性
加一行日志格式,把限流状态暴露出来便于排查:
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time $limit_req_status';$limit_req_status 值说明:
-:未触发限流
hit:请求被限流(返回 503)
delayed:进入 burst 队列并延迟处理
miss:key 未命中任何已定义 zone(配置有误)










