Nginx 如何限制每个 IP 地址的连接数,优化资源分配?
Nginx 限制每个 IP 地址的连接数
Nginx 提供了多种机制来限制单个 IP 地址所能建立的同时连接数,这对于防止资源耗尽和提高服务稳定性至关重要。以下是几种有效策略:
1. 使用 limit_conn 指令
limit_conn 指令可以在 server 或 location 块中使用,用于限制针对特定 zone 的连接数量。zone 是一个内存结构,用来跟踪 IP 的连接状态。
# 针对客户端地址,进行连接数限制
# 创建连接限制区域,每 IP 限 10M 字节内存
limit_conn_zone $binary_remote_addr zone=perip:10m;
# 针对域名,进行连接数限制
limit_conn_zone $server_name zone=perserver:10m;http {# 创建连接限制区域,每 IP 限 10M 字节内存limit_conn_zone $binary_remote_addr zone=perip:10m;
}server {# 每个 IP 同时允许的最大连接数为 10limit_conn perip 10;
}
这里的 $binary_remote_addr
变量包含了客户端 IP 的二进制形式,确保即便在存在 NAT 的情况下也能准确识别每个独立的 IP。
2. 结合 proxy_pass
实现负载均衡下的连接限制
当 Nginx 作为反向代理时,也可以在 location 块中使用 limit_conn
控制对上游服务器的连接数:
location / {# 每个 IP 对 / 位置的请求同时不超过 5 个limit_conn perip 5;proxy_pass http://upstream_server;
}
3. 利用 limit_req
控制请求速率
除了限制连接数,还可以限制 IP 的请求速率,从而间接控制连接数:
http {# 创建速率限制区域limit_req_zone $binary_remote_addr zone=mylead:10m rate=1r/s; # 每秒限速 1 次
}server {# 应用速率限制location / {limit_req zone=mylead burst=5 nodelay;}
}
这里,burst
参数指定了短时间内允许的额外请求数量,nodelay
表示一旦超过速率限制,立即拒绝额外请求。
4. 动态黑白 IP 名单管理
除了静态限制外,还可以根据访问模式动态调整限制:
geo $my_ip {default 1; # 默认允许192.168.1.1 0; # 特定 IP 禁止
}server {if ($my_ip == 0) {return 444; # 禁止黑名单 IP 的所有请求}
}
这种方式可以根据实际需求灵活增删黑名单条目,适用于应对突发攻击的情况。
总结
通常推荐结合多种策略,比如首先用 limit_conn
控制总体连接数,再用 limit_req
限制请求速率,以及适时使用黑名单或地理限制,构建多层次防御体系,以优化资源分配并保护服务稳定性。
最后,记得监测 Nginx 的访问日志,观察连接数变化趋势,适时调整参数,确保既能满足正常服务需求又不浪费资源。
参考:Nginx核心配置指令_54笨鸟