limit_conn用于防CC攻击,通过限制并发连接数实现零后端消耗防护;需在http块定义共享内存区,key推荐$binary_remote_addr,代理环境须用$realip_remote_addr并配置realip模块。

防 CC 攻击,核心是拦住大量并发连接打满服务器资源,limit_conn 正是干这事的——它不看请求内容、不等后端响应,只要 TCP 连接建立且请求头已读完,就计入计数。超限立即断连,零转发、零后端消耗。
必须在 http 块定义共享内存区
这是整个机制的前提,漏掉或放错位置会启动失败:
- 只能写在
http{}最外层,不能嵌套进server或upstream - 推荐用
$binary_remote_addr作 key:IPv4 固定 4 字节,IPv6 固定 16 字节,省内存、抗伪造 - 大小按真实 IP 数预估:10m ≈ 支持 16 万独立 IP;若业务有公网出口 NAT 或 CDN 回源,建议设 20m
示例:
limit_conn_zone $binary_remote_addr zone=cc_limit:20m;在 server 或 location 中启用限制
CC 攻击常集中打登录、API、下载等路径,建议按需精准控制:
- 全站防护:把
limit_conn cc_limit 5;放在server块开头(紧贴server_name后) - 重点路径防护:如只保
/login和/api/v1/submit,就写在对应location里 - 数值设保守值:普通用户多标签页+重试一般不超过 3~5;设 1 容易误伤,设 10 以上对 CC 防御效果弱
注意:limit_conn 限制的是“已建立未关闭”的连接数,HTTP/1.1 keepalive、WebSocket、HTTP/2 多路复用都算在内。
代理环境必须还原真实 IP
如果前面有 CDN、WAF、SLB 或云负载均衡,$binary_remote_addr 拿到的是它们的出口 IP,所有用户会被当成同一个 IP 限流,等于失效:
- 确认 Nginx 已编译含
http_realip_module - 用
set_real_ip_from明确声明可信上游网段(如 Cloudflare 的官方 IP 段) - 指定真实 IP 来源头字段:
real_ip_header X-Forwarded-For;或X-Real-IP(依上游实际传的为准) - zone key 改为
$realip_remote_addr,例如:limit_conn_zone $realip_remote_addr zone=cc_limit:20m;
增强防御与可观测性
单靠 limit_conn 不够稳,建议组合使用:
- 返回标准状态码:
limit_conn_status 429;,前端可识别并退避重试 - 日志精简:
limit_conn_log_level error;,避免超限刷屏掩盖真正问题 - 叠加请求速率控制:
limit_req zone=cc_req burst=8 nodelay;,防短连接高频刷 - 防单连接吃带宽:
limit_rate 100k;,尤其对下载类接口有效 - 监控拒绝数:通过
stub_status或 Prometheus 抓取limit_conn_rejected指标,判断阈值是否合理


















