可通过limit_req_zone指令配合$request_uri变量对高价值接口单独限流,支持带参URI精确区分,结合map预筛选和组合键提升精度,并通过burst/nodelay控制突发与拒绝策略。

可以通过 limit_req_zone 指令配合 $request_uri 变量,对指定高价值接口(如支付回调、用户登录、下单等)单独限流,避免全局限流误伤普通请求,同时精准压制恶意刷量或异常调用。
定义按 URI 精确匹配的限流区域
在 http 块中声明限流区域,使用 $request_uri 作为键,确保每个完整 URI(含参数)独立计数:
limit_req_zone $request_uri zone=high_value_api:10m rate=5r/s;
说明:
– $request_uri 包含路径和查询参数(如 /api/v1/pay/notify?mid=123),天然支持带参接口的区分限流;
– zone=high_value_api:10m 分配 10MB 共享内存,可存储约 16 万不同 URI;
– rate=5r/s 表示单个 URI 路径每秒最多 5 次请求,适合强校验类接口。
在 location 块中精准启用限流
仅对目标接口路径启用该 zone,不干扰其他路由:
location = /api/v1/user/login {
limit_req zone=high_value_api burst=10 nodelay;
proxy_pass http://backend;
}
location ~ ^/api/v1/pay/notify {
limit_req zone=high_value_api burst=3 nodelay;
proxy_pass http://backend;
}
关键点:
– 使用 = 精确匹配登录接口,避免前缀误匹配;
– 对支付回调用正则匹配,覆盖带参变体(如 /api/v1/pay/notify?id=xxx);
– burst=10 允许短时突发(如前端重试),nodelay 立即拒绝超限请求,不排队;
– 不加 delay 或 delay= 参数,防止恶意请求靠排队耗尽连接资源。
增强防护:组合变量提升精度
单一 $request_uri 可能被绕过(如加随机参数)。可叠加客户端标识,提高对抗能力:
map $request_uri $is_high_value {
~^/api/v1/(pay/notify|user/login|order/create) 1;
default 0;
}
limit_req_zone $is_high_value$request_uri zone=smart_api:10m rate=5r/s;
location /api/v1/ {
if ($is_high_value) {
limit_req zone=smart_api burst=5 nodelay;
}
proxy_pass http://backend;
}
这样既保留 URI 粒度,又通过 map 预筛选高危路径,避免为所有 URI 开销内存;$is_high_value$request_uri 组合键确保只有目标接口参与限流计算。
监控与调试建议
上线后需验证效果并持续观察:
- 开启
limit_req_log_level warn,在 error log 中捕获被限流的 URI 和客户端 IP; - 用
log_format记录$request_uri和$limit(是否触发限流)、$limit_rate(实际速率)字段; - 定期用日志统计高频被限 URI,判断是攻击还是业务误配置(如前端轮询未加防抖);
- 对必须放宽的接口(如活动期间的抢购入口),可临时改用更高 rate 或新增独立 zone。

















