限制单ip并发连接需先启用nginx limit_conn_module模块,再在http块定义limit_conn_zone,于server或location中配置limit_conn;但仅限连接数,须配合limit_req、cdn真实ip识别及防火墙等多层防御。

限制单个IP的最大TCP并发连接数,是防御轻度CC攻击的实用手段之一,但它不是万能的——关键在用对地方、配对参数、补上短板。
确认Nginx已启用limit_conn_module模块
宝塔默认安装的Nginx通常不带连接限制模块。直接写limit_conn_zone会报错“unknown directive”。必须先验证并启用:
- 登录服务器执行:
nginx -V 2>&1 | grep -o with-http_limit_conn_module,无输出即缺失模块 - 进入宝塔「软件商店 → Nginx → 设置 → 编译安装」,勾选「连接数限制模块」(部分版本显示为“Limit Conn”)
- 重新编译Nginx(期间网站会短暂不可用,建议低峰期操作)
在全局http块中定义连接限制区域
这个步骤不能在站点配置文件里做,必须写进Nginx主配置的http{}块顶层:
- 进入「软件商店 → Nginx → 设置 → 配置修改」
- 在
include语句之前插入两行:
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_log_level warn;
其中perip是自定义的共享内存区名称,后续所有limit_conn指令必须引用它;10m表示该区域最多存约16万个IP的连接状态。
在具体站点或路径中启用限流规则
回到目标站点的「配置文件」页面,在server或某个location块内添加:
-
limit_conn perip 10;—— 单IP最多维持10个并发TCP连接(注意:是“同时在线”的连接数,不是请求数) -
limit_conn_status 503;—— 被拒绝时返回503而非默认日志刷屏的503+错误 - 避免对
/static/、/assets/等静态资源路径盲目加限流,否则JS/CSS加载失败会导致页面白屏
认清它的局限并搭配其他手段
limit_conn只管连接数量,不管请求内容。攻击者用短连接(建连→发请求→立刻断开)就能轻松绕过——因为连接从不累积到10个。
- 必须配合
limit_req_zone做请求频率限制,例如:limit_req_zone $binary_remote_addr zone=peripreq:1m rate=5r/s;+limit_req zone=peripreq burst=5 nodelay; - CDN用户需开启「真实IP识别」,否则
$binary_remote_addr拿到的是CDN节点IP,整站会被当成一个IP限流 - 单靠Nginx限流效果有限,建议叠加防火墙规则(如每分钟新建连接≤15)、WAF频率策略、或验证码验证高风险接口(如登录页)










