必须先确认Nginx编译时启用http_limit_conn_module,否则limit_conn_zone报错;通过nginx -V检查,缺失则需在宝塔中重新编译并勾选“连接限制模块”;limit_conn_zone须置于http块顶部,使用$binary_remote_addr定义zone;limit_conn在server或location中引用该zone,控制每IP并发连接数,非请求数,且需配合real_ip配置CDN场景。

必须先确认 Nginx 编译时带了 http_limit_conn_module,否则所有 limit_conn_zone 配置都会报 unknown directive "limit_conn_zone" 错误——宝塔默认不启用这个模块。
怎么检查并启用 limit_conn_module
宝塔没开这个模块,写再多配置也没用。先执行命令验证:
nginx -V 2>&1 | grep -o with-http_limit_conn_module
如果没输出,说明缺失。此时不能靠“重载配置”解决,必须重新编译 Nginx:
- 进「软件商店 → Nginx → 设置 → 编译安装」,勾选「连接限制模块」(名称可能叫「HTTP 连接数限制」)
- 编译过程耗时 5–15 分钟,期间网站会短暂不可访问
- 完成后执行
nginx -V再确认是否出现with-http_limit_conn_module
别跳过这步直接改配置——这是 90% 用户配置不生效的根源。
在 http 块定义 limit_conn_zone 才有效
limit_conn_zone 必须放在全局 http 上下文中,不能塞进站点配置文件底部或 server 块里,否则 reload 不报错但完全不生效。
正确位置是:/www/server/nginx/conf/nginx.conf 中 http { 开头后、include 语句之前,或宝塔「Nginx 设置 → 配置修改」的 http 区域顶部:
http {
limit_conn_zone $binary_remote_addr zone=perip:10m;
include ...
}
注意点:
-
perip是 zone 名,后面limit_conn要严格一致 -
10m表示分配 10MB 共享内存,够存约 16 万个 IP(每个约 64 字节) - 别用
$remote_addr,要用$binary_remote_addr节省内存
在 server 或 location 块中加 limit_conn 规则
定义好 zone 后,才能在具体作用域启用限制。推荐放在站点的 server 块内(全局生效),或某个 location 下(如只限 API):
server {
...
limit_conn perip 5;
limit_conn_status 503;
}
关键细节:
-
limit_conn perip 5表示每个 IP 最多保持 5 个**活跃 TCP 连接**(不是每秒请求数) - 若用户开多个标签页、用长轮询、或页面含大量懒加载资源,很容易触发——Vue/React SPA 尤其敏感
-
limit_conn_status 503必须显式设置,否则被限请求返回 503 但日志疯狂刷屏,影响排查 - CDN 用户需先配
set_real_ip_from+real_ip_header X-Forwarded-For,否则限的是 CDN 节点 IP
limit_conn 和 limit_req 别混用,也别指望它防 CC
limit_conn 控的是连接数,limit_req 控的是请求速率,两者逻辑不同、生效时机也不同:
- 一个恶意脚本开 100 个 IP,每个只建 1 个连接但疯狂发请求——
limit_conn perip 5完全无效 - 一个正常用户开 6 个标签页,每个页面加载 JS/CSS/图片,瞬间占满 5 连接——直接卡死
- 它对 HTTP/2 多路复用支持有限,实际并发控制不如预期
- 真要防轻度 CC,得配合
limit_req_zone+limit_req,再加宝塔防火墙或系统层封禁
最常被忽略的一点:这个限制在连接建立阶段就起效,但不会区分请求内容。如果你的站点有上传接口、WebSocket 或 SSE,它们会长期占用连接,阈值必须比纯浏览场景设得更高。


















