不能直接用 limit_conn 限制大文件后缀并发数,需结合 location 正则匹配、独立 limit_conn_zone、limit_conn、limit_rate_after 和 limit_rate 实现精准限流;推荐 location ~* .(zip|rar|7z|iso|dmg|pdf|mp4|avi|mov|tar.gz|tgz)$ { } 配置,并前置白名单排除 JS/CSS 等资源;定义专用 zone=perip_download 避免混用;限流策略为每 IP 最多 3 连接,下载超 10MB 后限速至 512KB/s;上线前须用 ab 和手动下载验证效果。

不能直接用 limit_conn 限制“大文件后缀”的并发数,因为它只统计 TCP 连接,不识别文件类型或 URL 路径。但可以通过 location 正则匹配 + 独立 limit_conn_zone + limit_conn + limit_rate_after + limit_rate 的组合,精准压制 .zip、.mp4、.pdf 等高带宽消耗请求,避免它们挤占首页、API、JS/CSS 等关键资源的带宽。
用 location 精准拦截大文件请求
把需要限流的后缀集中到一个 location 块中,确保只作用于真实的大文件下载,不影响 HTML、API 或前端资源:
- 推荐写法:
location ~* \.(zip|rar|7z|iso|dmg|pdf|mp4|avi|mov|tar\.gz|tgz)$ { ... } -
~*表示大小写不敏感正则匹配,比=精确匹配更灵活,能覆盖多后缀 - 该
location必须放在try_files或proxy_pass规则之前,否则可能被上层规则提前处理而失效 - 若 Vue/React 项目有懒加载的
.js分块文件误入此规则,可额外加白名单location ~* \.(js|css|woff2|png|jpg|gif)$ { }放在它前面排除
定义专用连接区域,避免和正常流量混用
不要复用全局 perip zone(比如用于防刷页面的),否则用户开几个标签页就可能触发下载限流:
- 在
http{}块顶部添加:limit_conn_zone $binary_remote_addr zone=perip_download:10m; -
perip_download名称需与后续limit_conn中一致,语义清晰便于维护 -
10m内存约支持 16 万个独立 IP 记录,中小站点足够;若预估高峰 IP 数超 20 万,建议升至12m防止 “zone storage exhausted”
在 location 内启用连接+速率双控
仅限连接数不够——单个连接下载大文件仍会长期占满带宽。必须叠加速率控制:
- 示例配置:
limit_conn perip_download 3;<br>limit_rate_after 10m;<br>limit_rate 512k;
- 含义:每个 IP 最多 3 个并发下载连接;任一连接下载满 10MB 后,速率压至 512KB/s
-
limit_rate是按连接限速,不是按 IP 总和——3 并发最大占用 1.5MB/s,可控且留有余量 -
limit_rate_after建议设为略大于首屏资源体积(如 10–50MB),兼顾用户体验与带宽保护
上线前验证行为是否符合预期
配置生效后必须实测,避免策略过松或过紧:
- 用
ab -c 10 -n 20 http://yoursite/file.zip模拟 10 并发请求,观察返回 503 的比例是否接近设定值(如限 3 连接,约 70% 请求应失败) - 检查
access_log,确认状态码分布(正常 200 vs 限流 503)及$request_time是否合理 - 用浏览器或
wget手动下载一个 100MB 文件,验证前 10MB 是否快速完成,之后是否明显降速










