在高并发场景下,为每个IP设置合理的QPS(Queries Per Second)限流阈值,是防刷(如爬虫、恶意请求、撞库攻击等)的重要手段。但阈值过高则无法有效防御,过低则可能误伤正常用户(尤其是使用NAT或公共网络的用户,如公司网络、校园网、移动运营商共享IP等)。
以下是综合行业实践和安全策略的建议:
一、常见场景下的推荐QPS阈值
| 场景 | 建议QPS/每IP | 说明 |
|---|---|---|
| 普通Web API接口 | 5~10 QPS | 普通用户正常使用不会超过此范围,可有效防止简单脚本刷量 |
| 登录/注册接口 | 1~3 QPS | 敏感操作,应更严格,防止暴力破解 |
| 搜索/商品详情页 | 10~20 QPS | 用户浏览行为较频繁,可适当放宽 |
| 移动端API | 5~15 QPS | 移动端请求频率通常低于PC,但要考虑弱网重试 |
| 公开数据接口(如天气) | 20~50 QPS | 若开放给开发者,需更高限制,配合API Key更好 |
二、关键考虑因素
-
真实用户行为分析
- 通过日志分析正常用户的平均和峰值QPS。
- 例如:99%的用户单IP QPS < 8,则可设阈值为10,兼顾安全与体验。
-
NAT环境问题
- 多个用户共享一个公网IP(如学校、公司、4G网络),可能导致“误杀”。
- 解决方案:
- 结合用户身份(如登录态、Token)做二级限流。
- 使用滑动窗口算法 + 短期突发允许(burst)机制。
-
动态调整策略
- 初始保守设置(如5 QPS),根据监控逐步优化。
- 对可疑IP(如高频访问敏感路径)临时降阈值。
-
分层防护
- 第一层:IP级限流(基础防线)
- 第二层:用户级限流(基于账号/Token)
- 第三层:行为分析(如验证码、设备指纹)
三、推荐技术实现方式
-
算法选择:
- 漏桶(Leaky Bucket)或令牌桶(Token Bucket):支持突发流量,体验更好。
- 滑动日志(Sliding Log):精度高,适合严格限流。
-
工具/中间件:
- Nginx +
limit_req_zone - Redis + Lua 脚本实现分布式限流
- API网关(如 Kong、APISIX、阿里云网关)内置限流功能
- Nginx +
-
示例 Nginx 配置:
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s; location /api/ { limit_req zone=api burst=20 nodelay; proxy_pass http://backend; }表示:每个IP最多10 QPS,允许突发20次,不延迟处理。
四、最佳实践建议
- 不要只依赖IP限流:结合用户身份、行为模式、设备指纹等多维度判断。
- 设置分级告警:当某IP接近阈值时记录日志,触发风控分析。
- 提供白名单机制:对可信IP(如CDN回源IP、合作伙伴)放行。
- 定期复盘调整:根据业务增长和攻击趋势动态优化阈值。
总结
✅ 推荐初始值:普通接口设为 5~10 QPS,敏感接口设为 1~3 QPS
✅ 结合用户身份、行为分析、突发容忍机制,避免误伤
✅ 使用分布式限流组件,确保在集群环境下一致生效
最终阈值应基于实际业务流量建模和攻防演练确定,没有“一刀切”的标准,但上述范围已被多数互联网公司验证为平衡安全与体验的有效区间。
云小栈