防御 CC 攻击没有万能参数,推荐从 limit_req_zone 按 IP 限流入手,rate 设 1-5r/s、burst 设 5-10、配合 10m 共享内存,根据业务敏感度逐步调整。
先说结论:Nginx 防 CC 攻击主要靠 limit_req 和 limit_conn 模块组合,参数需按业务场景定制,公开资料中没有统一的"最佳数值"。
- 先判断:确认攻击类型是高频请求还是高并发连接,选择对应模块
- 优先做:在 http 块定义 limit_req_zone,在 server 或 location 块启用 limit_req
- 再验证:通过 access_log 观察限流效果,避免误伤正常用户
完整配置上下文示例
以下是一个最小可用的 nginx.conf 结构示例,展示了限流配置在配置文件中的正确位置。注意 limit_req_zone 必须放在 http 块内,而 limit_req 指令放在 server 或 location 块内。
http {
# 定义限流区域,10m 内存约存储 16 万个 IP 状态
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=5r/s;
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
listen 80;
server_name example.com;
# 全局默认限流(可选)
limit_req zone=mylimit burst=10 nodelay;
limit_conn addr 10;
location /login {
# 敏感接口单独严格限制
limit_req zone=mylimit burst=5 nodelay;
limit_conn addr 5;
}
location /static/ {
# 静态资源通常不限流或宽松限制
limit_req off;
}
}
}不同业务场景参数推荐
直接套用 5r/s 可能会误伤高并发正常业务。建议先通过日志分析正常用户请求频率基线,再参考以下范围进行初始配置:
| 业务场景 | 推荐 rate | 推荐 burst | 说明 |
|---|---|---|---|
| 登录/注册/短信 | 1r/s - 2r/s | 3 - 5 | 高频敏感接口,需严格限制防止爆破 |
| 普通 API 接口 | 5r/s - 10r/s | 10 - 20 | 兼顾用户体验与防护,允许短暂突发 |
| 静态资源/图片 | 不限或 50r/s+ | 50+ | 通常不需要限制,避免影响页面加载速度 |
| 搜索接口 | 2r/s - 5r/s | 5 - 10 | 消耗后端资源较大,建议适当限制 |
注意:生产环境上线前,务必在灰度环境或使用低流量时段进行基线测试,观察正常用户是否触发 429/503 状态码。
验证与监控方法
1. 日志统计验证
限流触发后,Nginx 默认返回 503 状态码(可配置为 429)。使用以下命令统计被拦截的请求数量:
grep " 503 " /var/log/nginx/access.log | wc -l
# 如果配置了 limit_req_status 429,则 grep " 429 "2. 模拟压力测试
在测试环境使用 ab 工具模拟超过 rate 的请求频率,观察是否被拦截。生产环境谨慎使用,避免误触发防护影响真实用户。
ab -n 1000 -c 10 http://your-domain.com/login3. 错误日志监控
limit_req 和 limit_conn 触发时会在 error.log 中记录关键词 "limiting requests" 或 "limiting connections",便于实时告警。
grep "limiting" /var/log/nginx/error.log常见工程坑点
1. burst 参数误解
burst 不是并发数上限,而是漏桶能临时容纳的额外请求数。设为 0 时所有超速请求立刻拒绝;设为 10 并配 nodelay,等于允许瞬时 10 个请求打进来,但后续仍受 rate 约束。
2. 配置位置错误
limit_req_zone 只能在 http 块中使用,不能在 server 或 location 块定义,否则 Nginx 启动会报错。limit_req 指令则相反,必须放在 server 或 location 中生效。
3. 单一维度易绕过
仅按 IP 限流时,攻击者使用代理池可绕过。高敏感场景建议结合 IP+URI 组合限流,例如 key 设置为 $binary_remote_addr$uri。
4. 误伤正常用户
rate 设得太低会影响真实用户体验。建议先设宽松参数,观察日志后逐步收紧。公开资料中没有可靠的量化数据说明"多少 r/s 最合适",需结合基线测试调整。
5. 忘记配合其他防护
限流只是基础防护,CC 攻击严重时需配合 WAF、验证码、CDN、黑名单等手段。单靠 Nginx 限流无法应对大规模分布式攻击。
参考文档
- Nginx Official Documentation - ngx_http_limit_req_module
- Nginx Official Documentation - ngx_http_limit_conn_module