必须在http块中用$realip_remote_addr定义limit_conn_zone,再于敏感下载location中配置limit_conn,确保每IP最多3个并发连接且仅限该路径生效。

要严格限制单个客户端 IP 对敏感下载接口的并发连接数,核心是用 Nginx 的 limit_conn 指令配合 limit_conn_zone 定义共享内存区域,并精准绑定到特定 location。关键在于:IP 提取要可靠(尤其在有代理时),zone 容量要合理设置,且必须确保该限制只作用于目标接口路径,不干扰其他流量。
定义基于客户端真实 IP 的连接限制区域
不能直接用 $remote_addr(可能被代理污染),需先通过 realip 模块还原真实 IP,再基于它创建 zone:
- 在
http块中添加:limit_conn_zone $realip_addr zone=download_limit:10m; - 启用 realip 模块还原 IP(假设可信代理为 192.168.1.0/24):
set_real_ip_from 192.168.1.0/24;<br>real_ip_header X-Forwarded-For;<br>real_ip_recursive on;
- 定义变量供 zone 使用:
map $remote_addr $realip_addr {<br> default $remote_addr;<br>}(配合 realip 后,$remote_addr 已为真实 IP,此 map 可省略;若未启用 realip,需用$http_x_forwarded_for并截取首段)
在敏感下载 location 中启用 limit_conn
仅对实际处理下载的路径生效,避免影响静态资源或 API 其他端点:
- 示例配置:
location /api/v1/download/ {<br> limit_conn download_limit 3;<br> # 后续 proxy_pass 或 try_files 等实际逻辑<br>} -
limit_conn是硬限制:超出立即返回 503,不排队、不延迟 - 数字
3表示每个唯一 IP 最多维持 3 个**同时活跃的连接**(非请求数),适用于大文件流式下载场景
区分连接与请求,避免误判
limit_conn 限制的是 TCP 连接数,不是 HTTP 请求频次。这对下载接口更合理,因为一个大文件下载常复用长连接,而多个小请求可能走短连接:
- 若需限制每秒请求数,应叠加
limit_req(如防爬虫刷小文件) - 确认客户端是否启用 HTTP/2 —— 同一连接可多路复用,此时
limit_conn仍按连接计,而非 stream 数 - 浏览器并行下载通常开 6 连接,设为 3 可有效抑制批量下载,又不卡死正常用户
验证与调试要点
上线前务必实测,重点检查 IP 识别和响应行为:
- 用
curl -v http://your-api/download/file.zip多开几个终端,观察第 4 个连接是否返回 503 - 查 Nginx 错误日志:
limiting connections by zone "download_limit"出现即生效 - 用
nginx -t验证配置语法,重启后执行nginx -s reload - 若用 CDN 或四层 LB,确保它们透传真实 IP(如设置
X-Real-IP),并在 Nginx 中对应调整set_real_ip_from


















