Nginx连接限制需两步:先在http块用limit_conn_zone定义共享内存区(如zone=perip:10m),再在server或location块用limit_conn perip N启用,限制每个IP并发TCP连接数;推荐补充日志级别、返回码、限速及真实IP配置。

核心就两步:先在 http 块 定义共享内存区域,再在 server 或 location 块 中启用限制。它统计的是当前活跃的 TCP 连接数(包括 keepalive、HTTP/2 多路复用连接),不是请求数。
第一步:定义共享内存区域(必须放在 http 块)
在 Nginx 主配置文件(如 /etc/nginx/nginx.conf 或宝塔的「Nginx 设置 → 配置修改」的 http 区域顶部)添加:
limit_conn_zone $binary_remote_addr zone=perip:10m;
说明:
-
$binary_remote_addr是客户端 IP 的二进制格式,比$remote_addr更省内存、更稳定; -
zone=perip:10m表示创建名为perip的共享内存区,大小为 10MB; - 10MB 约可存储 16 万~30 万个独立 IP 的连接状态,若预估访问 IP 数量大,可适当调高(如
20m); - 该指令只能出现在
http{}块中,写在 server 或 location 内会无效或报错。
第二步:在具体位置启用限制
在需要防护的站点配置或路径中加入 limit_conn 指令:
例如,在整个站点生效(写在 server 块内):
limit_conn perip 10;
或仅对 API 接口限流(写在 location 块内):
location /api/ {<br> limit_conn perip 5;<br>}
说明:
-
perip必须与上面limit_conn_zone定义的 zone 名完全一致; -
10或5表示每个 IP 最多允许的并发连接数; - 若同时在 server 和 location 中配置,以更严格的那个为准;
- 注意:它不限制请求频率,只管“有多少个连接同时开着”。
第三步:增强实用性与可观测性(推荐补充)
让限流更可控、更容易排查问题:
- 加日志级别控制:在 http 或 server 块中加
limit_conn_log_level error;,避免限流日志刷屏; - 自定义返回码(可选):加
limit_conn_status 429;,返回 429 Too Many Requests,语义更明确; - 配合限速防拖慢:在同级块中加
limit_rate 200k;,防止单个连接持续占带宽; - CDN 或代理环境下,务必配置
set_real_ip_from和real_ip_header,否则$binary_remote_addr会是 CDN 节点 IP,导致限流失效。
验证是否生效
上线后可通过以下方式确认:
- 用
ab -n 100 -c 20 http://yoursite.com/模拟并发,观察是否出现 503 或 429 响应; - 查看 Nginx 错误日志:
tail -f /var/log/nginx/error.log,命中限流时会出现limiting connections by zone; - 执行
nginx -t确保语法正确,再nginx -s reload生效; - 宝塔用户务必先确认模块已启用:
nginx -V | grep http_limit_conn_module,无输出则需重编译 Nginx 并勾选“连接限制模块”。

















