Nginx 通过 limit_conn_zone 和 limit_conn 限制单 IP 并发连接数,需在 http 块定义 zone,server 或 location 中启用;$binary_remote_addr 更省内存;NAT 环境下可能误伤用户。

在 Nginx 中,限制每个 IP 地址的并发连接数主要通过 limit_conn 指令配合 limit_conn_zone 实现,而不是直接对每个 IP 单独配置 server 块。server 块本身不支持“为每个 IP 写一个 server”的方式来限连——那是不可扩展且不现实的做法。
使用 limit_conn_zone 定义连接限制区域
你需要先在 http 块中定义一个基于客户端 IP 的共享内存区域,用于统计和限制连接数:
http {
# 定义一个名为 addr 的连接限制区域,按 $binary_remote_addr(二进制格式 IP)统计
# zone 名字是 addr,大小设为 10m(约可存储 16 万个 IP 记录)
limit_conn_zone $binary_remote_addr zone=addr:10m;
}注意:$binary_remote_addr 比 $remote_addr 更节省内存,推荐使用;zone 大小需根据预期 IP 数量估算,太小会导致拒绝新 IP 的连接记录。
在 server 或 location 块中启用连接限制
然后在具体的 server 或 location 块里应用该限制:
server {
listen 80;
server_name example.com;
<pre class="brush:php;toolbar:false;"># 限制每个 IP 最多 10 个并发连接
limit_conn addr 10;
# (可选)配合 limit_rate 控制单连接带宽,防慢速攻击
limit_rate 100k;
location / {
proxy_pass http://backend;
}}
- 若放在
server块内,限制作用于该 server 下所有请求(含所有 location) - 若放在某个
location块内,则只对该路径生效 - 超过限制时,Nginx 默认返回
503 Service Temporarily Unavailable
区分 IPv4 和 IPv6(可选但建议)
如果需要分别限制 IPv4 和 IPv6,可以定义两个 zone,或用更精细的变量(如判断前缀),但通常 $binary_remote_addr 已天然支持双栈,无需额外处理。真正要注意的是:NAT 环境下多个用户可能共享一个公网 IP,此时限制会误伤正常用户,需结合业务权衡。
验证与调试技巧
- 用
curl -I http://your-site/多开几个终端并发请求,观察是否出现 503 - 开启 Nginx 错误日志(
error_log /path/error.log info;),限连触发时会记录limiting connections by zone日志 - 用
nginx -t检查配置语法,reload 后用ss -s | grep "tcp:"或netstat -an | grep :80 | wc -l辅助观察连接数趋势











