limit_conn模块通过限制单ip并发tcp连接数防御连接洪泛攻击,需在http块定义共享内存区limit_conn_zone,再在server或location中配置limit_conn规则,并配合real_ip配置、keepalive优化及limit_req形成双层防护。

直接用 limit_conn 模块就能有效拦住单 IP 的连接洪泛,核心是控制“同时建立的 TCP 连接数”,而不是请求频率。它对短连接刷量、慢速攻击、连接耗尽类压测特别管用。
定义基于 IP 的共享内存区域
必须在 http 块里声明一个全局计数区,Nginx 用它实时跟踪每个 IP 的活跃连接数:
limit_conn_zone $binary_remote_addr zone=conn_ip:10m;-
$binary_remote_addr是客户端真实 IP 的紧凑二进制格式,比$remote_addr更省内存; -
zone=conn_ip:10m表示创建名为conn_ip的共享内存区,10MB 可存约 16 万个独立 IP 的状态; - 这行不能写在
server或location里,否则会报错。
在具体位置启用连接限制
把限流规则加到需要防护的上下文,比如整个站点或关键接口路径:
-
limit_conn conn_ip 8;—— 每个 IP 最多维持 8 个并发连接; - 放在
server块里,作用于全部请求;放在location /api/下,则只限制该路径; -
limit_conn_log_level error;把超限日志设为 error 级别,方便从日志快速定位攻击源; -
limit_conn_status 503;超限时返回 503,避免暴露后端真实状态。
配合真实 IP 识别和连接管理
如果 Nginx 前面有 CDN、WAF 或负载均衡,直接取 $binary_remote_addr 会得到代理 IP,必须先还原真实客户端地址:
- 配置
set_real_ip_from指定可信代理网段; - 设置
real_ip_header X-Forwarded-For;或X-Real-IP(依上游实际头字段而定); - 调小
keepalive_timeout(例如设为 15),防止合法长连接堆积占用额度; - 不建议单独依赖
limit_conn,搭配limit_req控制每秒请求数,形成连接层 + 请求层双保险。
验证与监控要点
上线后要确认规则生效并持续观察效果:
- 检查 Nginx 配置语法:
nginx -t,重载:nginx -s reload; - 查看 error 日志中是否有
limiting connections by zone相关记录; - 监控指标
limit_conn_rejected(被拒绝连接数),突增说明可能遭遇扫描或压测; - 阈值不是越小越好,需结合业务正常并发峰值设定,比如后台管理页可设 3,公开 API 可设 15~30。











