limit_conn通过限制单IP并发TCP连接数来控制大文件下载线程数,需在http块定义limit_conn_zone,再在匹配资源的location中配置limit_conn与limit_rate协同限流。

直接用 limit_conn 限制单 IP 对特定大文件资源的下载线程数,本质是控制其**并发 TCP 连接数**,从而避免一个用户开多个下载器(如迅雷、IDM)抢占全部带宽。它不按“线程”计,而是按“同时打开的连接”计——每个下载线程通常对应一个 TCP 连接,所以效果等价。
只对大文件目录或后缀启用限流
不能全局一刀切,否则会误伤网页访问(尤其 Vue/React 等 SPA 加载多个 JS/CSS 资源)。应精准作用于实际下载路径:
- 在
location块中匹配目标资源,例如:location ~* \.(zip|rar|iso|tar\.gz|exe)$ { - 或限定目录:
location /download/ { - 在该 location 内写
limit_conn perip 2;,表示每个 IP 最多 2 个并发连接用于下载这类文件
必须配合 limit\_conn\_zone 定义共享内存区
该指令只能出现在 http 块顶层,且必须早于所有 server 和 location:
- 加在
nginx.conf的http {开头部分:limit_conn_zone $binary_remote_addr zone=perip:10m; - 用
$binary_remote_addr(非$remote_addr)更省内存,10MB 可存约 16 万个 IP 状态 - zone 名称
perip必须与后续limit_conn perip 2中的一致
搭配 limit\_rate 实现带宽公平分配
limit_conn 控连接数,limit_rate 控单连接带宽,两者叠加才能兼顾“数量”和“速度”:
- 在同一
location块中添加:limit_rate 512k; - 若某 IP 开了 2 个连接,总带宽上限就是 512k × 2 = 1024k;其他人仍有余量可用
- 注意:该限速是对每个连接生效,不是对 IP 总带宽——这是 Nginx 的设计逻辑,也是实现公平性的关键
避开常见陷阱
实际配置中容易踩坑,需特别注意:
-
limit_conn不能写在if或嵌套location内,否则报错或不生效 - HTTP/2 下单连接可复用多请求,
limit_conn对下载器效果减弱,此时建议改用limit_req控制请求频率(如rate=2r/s) - 不要和
try_files $uri $uri/ /index.html混用在同一个 location —— 否则所有前端路由都会被当作下载资源限流,导致页面白屏 - 验证是否生效,看
error.log是否出现limiting connections by zone日志,而非仅靠浏览器表现判断










