不能直接用limit_conn限制特定后缀文件并发数,需通过location正则匹配(如.zip|.pdf|.mp4等)+独立limit_conn_zone(perip_download)+limit_conn 3 + limit_rate_after 10m + limit_rate 512k组合实现精准控流,防止大文件挤占关键资源带宽。

不能直接用 limit_conn 限制“特定后缀文件”的并发下载数,因为它工作在 TCP 连接建立阶段,不解析 URL 或文件类型。但可以通过 location 正则匹配 + 独立 limit_conn_zone + limit_conn 组合,精准控制 .zip、.pdf、.mp4 等大文件的并发连接,防止它们挤占 HTML、API、JS/CSS 等关键资源的带宽。
用 location 精准拦截目标文件后缀
把需限流的二进制/大体积文件统一归到一个 location 块中,避免影响基础业务:
- 推荐写法:
location ~* \.(zip|pdf|mp4|iso|tar\.gz|7z|dmg|avi|mov)$ { ... },~*表示大小写不敏感正则匹配,比=或^~更灵活 - 该块必须放在
try_files、proxy_pass或其他重写逻辑之前,否则请求可能被提前处理而绕过限流 - 若站点含 Vue/React 懒加载 chunk(如
123.chunk.js),可加白名单 location 放行常见静态资源,防止误限
为下载流量单独定义连接状态区
避免复用全局 perip zone,防止用户开多个标签页刷首页就触发限流:
- 在
http{}块中添加:limit_conn_zone $binary_remote_addr zone=perip_download:10m; -
perip_download名称需与后续limit_conn中一致,语义清晰便于维护 - 10MB 内存约支持 16 万个独立 IP 记录,中小规模站点足够;高并发场景可按需调至 20m
在 location 内启用并发限制并搭配限速策略
仅控连接数不够,还需防止单连接长期占满带宽:
- 在上述 location 中写:
limit_conn perip_download 3;—— 每个 IP 最多 3 个并发下载连接 - 加上:
limit_rate_after 10m; limit_rate 512k;—— 单连接下载满 10MB 后速率压至 512KB/s -
limit_rate是按连接生效,不是按 IP;允许 3 并发时,该 IP 最高占用约 1.5MB/s,仍可控 - 建议
limit_rate_after设为略大于首屏资源体积(如 10–50MB),兼顾初始加载速度和带宽保障
验证行为是否符合预期
上线前务必实测,确认逻辑未被绕过或误伤:
- 用
ab -c 10 -n 20 http://yoursite/test.zip模拟并发,观察返回 503 的比例是否接近设定值(如 3 并发 → 约 70% 请求应成功) - 检查 access_log,确认状态码分布(200 vs 503)、
$request_time是否合理,以及$limit和$limit_key字段是否记录了限流详情 - 若使用 CDN 或 SLB,需配置
set_real_ip_from和real_ip_header,确保$binary_remote_addr取到真实客户端 IP










