应针对大文件下载接口在location块内实施四层限流:路径匹配、IP+路径双维度连接限制、limit_rate_after延后限速、连接数与速率组合控制,避免全局配置影响正常访问。

直接在 location 块里做精准限制,比全局 server 级配置更有效。大文件下载接口(比如 /download/ 或 /api/file/)容易被脚本批量刷取,单靠 limit_conn 全局控 IP 并发数不够——它不区分路径,且无法应对 HTTP/2 多路复用带来的连接“虚高”。必须结合路径、连接数、速率、触发条件四层控制。
只对大文件接口启用限流
把限流指令写在具体 location 块内,而不是整个 server 块,避免影响正常页面访问:
- 匹配路径要明确,例如:
location ^~ /download/ { ... }或location ~* \.(mp4|zip|iso|dmg)$ { ... } - 确保该 location 没有被其他
location(如location / { ... })优先覆盖 - 若使用宝塔等面板,编辑站点配置时,在
location /外单独加一个带路径的location块,并确认其位置在root和index之后
按 IP + 路径组合建 zone,防绕过
仅用 $binary_remote_addr 容易被同一 IP 下多个用户或 CDN 后端共享导致误伤或漏控。升级为“IP + 请求路径”双维度计数:
- 在
http{}块中定义:limit_conn_zone $binary_remote_addr$request_uri zone=dl_peripuri:10m; - 在对应
location中启用:limit_conn dl_peripuri 3;(即每个 IP 访问该路径最多 3 个并发) - 注意:
$request_uri包含参数,适合防带不同 token 的重复请求;若需忽略参数,改用$binary_remote_addr$host$uri
配合 limit_rate_after 实现“先快后稳”
纯 limit_rate 200k 会从第一字节就开始压速,影响首屏体验。对大文件应允许快速加载前几 MB,再限速:
-
limit_rate_after 5m;:单连接下载满 5MB 后才开始限速 -
limit_rate 300k;:之后稳定在 300KB/s - 这样既防止秒开式刷取(前 5MB 很快但总量有限),又保障真实用户前段体验
叠加连接数与速率双重保险
单靠一种限制易被绕过。推荐组合策略:
- IP 级硬限:
limit_conn perip 5;(整个站点每 IP 最多 5 连接) - 路径级精限:
limit_conn dl_peripuri 2;(该下载路径每 IP+路径最多 2 连接) - 连接级限速:
limit_rate_after 2m; limit_rate 150k;(防单连接吃满带宽) - 可选增强:加
limit_req zone=burst_dl burst=5 nodelay;防短时密集请求(需提前定义 zone)
改完配置后务必执行 nginx -t 检查语法,再 nginx -s reload 生效。观察 nginx -V 2>&1 | grep limit 确认模块已编译进内核。实际效果可通过 ab 或 wrk 模拟多线程下载验证。

















