Nginx 通过 limit_conn 实现单 IP 并发连接限制,需先在 http 块用 $binary_remote_addr 定义 limit_conn_zone,再在 server 块中配置 limit_conn;代理环境须配合 realip 模块还原真实 IP,并可搭配 limit_rate、limit_conn_log_level 和 limit_conn_status 提升防护效果。

在 Nginx 的 server 块中使用 limit_conn,是最常用、最直接的单 IP 并发连接限制方式。它不区分请求路径或响应内容,只统计同一客户端 IP 当前建立且未关闭的 TCP 连接数,轻量高效,适合防刷、保资源。
必须先定义共享内存区域(http 块内)
limit_conn_zone 指令只能出现在 http 块顶层,它是整个限流机制的基础:
- 务必用
$binary_remote_addr作 key —— 它是 IPv4(4 字节)或 IPv6(16 字节)的固定长度二进制格式,内存占用可控、统计准确;$remote_addr长度不固定,会导致配置错误甚至 worker 崩溃 - zone 名称自定义,如
perip,大小按需设置:10m约支持 16 万个独立 IP 记录(每个约 64 字节) - 示例:http { limit_conn_zone $binary_remote_addr zone=perip:10m; }
在 server 块中启用限制(全站生效)
把 limit_conn 放在 server 块开头(紧贴 listen 和 server_name 后),即可对所有进入该虚拟主机的连接生效:
- 它覆盖静态文件、API 接口、Vue/React 的前端路由回退(如
try_files $uri $uri/ /index.html),因为限制的是 TCP 层连接,不是 URL 路径 - 数值代表每个 IP 最多维持的并发连接数,例如
limit_conn perip 16;表示最多 16 个活跃连接(含 keepalive、HTTP/2 多路复用流) - 注意:
limit_conn不允许出现在http块中,否则启动报错:"limit_conn" directive is not allowed here
代理环境下要还原真实 IP
如果 Nginx 前有 CDN、SLB 或 WAF,$binary_remote_addr 默认是上游代理地址,需配合 realip 模块:
- 确认已编译或加载
ngx_http_realip_module - 用
set_real_ip_from声明可信代理网段(如10.0.0.0/8),再设real_ip_header X-Forwarded-For; - 之后改用
$realip_remote_addr作为limit_conn_zone的 key,才能真正限制终端用户 - 避免直接用
$http_x_forwarded_for—— 它可被伪造,且可能含多个 IP 或为空
搭配使用提升防护效果
仅限连接数有时不够,建议组合以下指令增强实用性:
-
limit_rate 512k;:对已放行的每个连接限速,防止大文件下载长期占满连接配额 -
limit_conn_log_level error;:把限流日志提至 error 级,便于快速识别异常流量 -
limit_conn_status 429;:返回标准 RFC 限流状态码(比默认 503 更语义明确) - 验证方法:用
ab -n 100 -c 20 http://your.site/模拟并发,观察是否返回 429 或 503,并检查 error.log 中是否有limiting connections by zone


















