Nginx限制单个IP并发连接数需三步:一是在http块用limit_conn_zone $binary_remote_addr zone=perip:10m定义共享内存区;二在server或location中用limit_conn perip N启用限制,统计活跃TCP连接数(含keepalive、HTTP/2);三在代理环境下改用$realip_remote_addr并配置real_ip_module识别真实IP。

Nginx 限制单个 IP 并发连接数,核心是用 limit_conn 模块,分三步就能生效:定义共享内存区、启用连接限制、处理代理环境下的真实 IP。
定义共享内存区(必须在 http 块)
用 limit_conn_zone 指令创建一个基于客户端 IP 的计数区域:
http {
limit_conn_zone $binary_remote_addr zone=perip:10m;
}-
$binary_remote_addr是推荐的键,比$remote_addr更省内存(IPv4 固定 4 字节,IPv6 固定 16 字节) -
zone=perip:10m表示分配 10MB 共享内存,约可存储 16 万~32 万个独立 IP 的连接状态 - 内存不足时 Nginx 日志会报
limit_conn: cannot add connection,可适当调大(如20m)
在 server 或 location 中启用限制
引用上面定义的 zone,并设上限值:
server {
listen 80;
server_name example.com;
location /api/ {
limit_conn perip 5; # 每个 IP 最多 5 个并发连接
proxy_pass http://backend;
}
}-
limit_conn perip 5统计的是当前活跃 TCP 连接数(含 keepalive、HTTP/2 多路复用流),不是请求数 - 放在
location下只对路径生效;放在server块则作用于整个虚拟主机 - 值不宜设为 1(浏览器多标签页易触发限流),常见合理值为 3~10,爬虫防护可设更低(如 3)
代理环境下获取真实客户端 IP
如果 Nginx 前有 CDN、SLB 或 WAF,$binary_remote_addr 默认是代理地址,需改用可信来源:
- 确保已加载
http_realip_module(编译时默认包含) - 配置可信上游网段:
set_real_ip_from 10.0.0.0/8; set_real_ip_from 192.168.0.0/16; real_ip_header X-Forwarded-For;
- 将
limit_conn_zone改为:limit_conn_zone $realip_remote_addr zone=perip:10m;
- 不推荐直接用
$http_x_forwarded_for,因该头易被伪造,必须配合set_real_ip_from校验
不复杂但容易忽略


















