高频接口需梯度限流:正常流量放行、突发流量缓冲、恶意流量拦截;通过Nginx组合limit_req规则、多key、分级location及map打标实现分层控制,并辅以limit_conn和limit_rate构建三层防线。

高频接口需要梯度限流,不是一刀切地卡死,而是分层响应:正常流量放行、突发流量缓冲、恶意流量拦截。Nginx 本身不支持“自动分级”的智能策略,但可以通过组合多个 limit_req 规则 + 不同 key + 分级 location,模拟出清晰的梯度效果。
按访问来源分层限流
同一接口对不同来源设置不同严格程度:
-
普通用户(IP维度):宽松限流,比如
rate=50r/s,burst=100,保障体验 -
未登录用户或匿名请求:用
$http_cookie或$arg_token判断是否带有效凭证,无则走更严规则,如rate=5r/s -
已知爬虫 UA 或扫描特征:配合
map指令打标,在 http 块中定义:
~*curl|httpie|wget|python-requests "1";
~*sqlmap|nuclei|dirb "1";
default "0";
}
然后在 location 中引用:limit_req zone=bot_limit if=$is_bad_bot;,配 rate=1r/m 直接封堵。
按请求路径精细区分
同一个域名下,/api/v1/login 和 /api/v1/public/data 的风险等级不同,不能共用一套限流:
- 登录接口加严:用
$binary_remote_addr+rate=1r/s+burst=3,防爆破 - 公开数据接口放宽:用
$binary_remote_addr+rate=20r/s,或改用$http_x_forwarded_for(需可信代理)避免 CDN 后所有用户被统一封禁 - 关键写操作(如 /order/create)可叠加用户标识限流:
limit_req_zone $http_x_user_id zone=user_write:10m rate=3r/m;,再在 location 中调用
用 burst + nodelay 实现“软硬两级”响应
这是最实用的梯度技巧:让系统对短时高峰有弹性,又不失控制力。
-
burst=30 nodelay:允许最多 30 个请求瞬间通过(比如秒杀开场),不排队、不延迟 - 但注意:这 30 个位置不会立刻释放,仍按
rate速率逐个归还(例如rate=10r/s,每 100ms 释放 1 个),后续请求继续受控 - 真正恶意刷量(如每秒发 200 请求)会迅速耗尽 burst,超出部分直接返回 503,实现“硬拦截”
结合连接数限制做底层兜底
限流只管“请求频率”,不管“连接堆积”。高频接口常伴随大量短连接或慢连接,需补充并发控制:
- 加
limit_conn perip 10;防止单 IP 建立过多连接 - 加
limit_rate 512k;控制单连接响应体传输速度,避免大响应拖垮带宽 - 二者和
limit_req协同,形成“请求频次 → 连接数量 → 响应带宽”三层防线


















