直接在location块中按文件后缀精准限流更高效,需先定义limit_conn_zone,再为.mp4等后缀配置limit_conn、limit_rate及limit_rate_after,并叠加limit_req防请求洪峰,最后验证调试。

直接在 location 块中针对文件后缀做精准限流,比全局限速更高效、干扰更小。关键在于把 limit_conn 和 limit_rate 放到匹配特定后缀(如 .mp4、.zip、.iso)的路径下,而不是套在根目录或 server 级别。
一、先定义 IP 连接计数区(写在 http 块顶部)
这是所有限流的前提,必须放在 nginx 配置的 http{} 大括号最开始处,不能嵌套在 server 或 location 里:
limit_conn_zone $binary_remote_addr zone=dlip:10m;
这行表示:用客户端 IP 的二进制格式作为唯一键,在名为 dlip 的 10MB 共享内存区中统计每个 IP 的并发连接数。10m 约可记录 32 万个 IP,日常够用。
二、为下载后缀单独配置 location 块
进入目标网站的 Nginx 配置(宝塔面板 → 网站 → 设置 → 配置文件),在 server{} 内添加专门匹配高带宽文件的 location,例如:
location ~* \.(mp4|avi|mkv|zip|rar|iso|tar\.gz|pdf)$ {-
limit_conn dlip 1;← 每个 IP 最多 1 个并发连接 -
limit_rate 256k;← 单连接限速 256KB/s(约 2Mbps) -
limit_rate_after 5m;← 前 5MB 全速,之后才启用限速(提升小文件体验) }
注意:~* 表示不区分大小写匹配;limit_rate_after 能避免对小文件(如几十 KB 的 PDF 封面)造成感知卡顿。
三、配合 limit_req 防止短时请求洪峰
仅靠连接数限制,无法防住单连接内高频 range 请求(比如迅雷多线程下载同一文件)。建议叠加请求速率控制:
- 在 http 块加:
limit_req_zone $binary_remote_addr zone=dreq:10m rate=2r/s; - 在同个 location 块内加:
limit_req zone=dreq burst=4 nodelay;
含义:每个 IP 每秒最多 2 个新请求,允许最多积压 4 个(立刻响应,不排队),超了返回 503。这对爬虫和自动下载脚本很有效。
四、验证与调试要点
改完保存后务必重载 Nginx(宝塔点「重载配置」或执行 nginx -s reload):
- 用 curl 测试:
curl -I http://yoursite.com/file.zip,看响应头是否含X-RateLimit-Limit(需自定义日志或 add_header 才显示) - 真实测速建议用浏览器开发者工具 Network 标签,或
wget --no-cache -O /dev/null http://.../big.mp4观察平均速度 - 查看错误日志:
/www/wwwlogs/yoursite.error.log,若频繁出现503 Service Temporarily Unavailable,说明限流过严,可适当调高limit_conn或burst值
不复杂但容易忽略:location 的正则匹配顺序很重要,确保它没被更宽泛的 location / 提前截获;另外,静态文件若走 CDN,这些规则需部署在 CDN 回源层或源站 Nginx 上才生效。










