可直接用 limit_conn_zone 配合 URI、文件后缀或请求头等变量实现静态文件并发控制,关键是以文件特征为 key 定义 zone,并在对应 location 中调用 limit_conn;需平衡共享内存大小与 key 粒度,避免 zone 耗尽导致 503。

可以直接用 limit_conn_zone 配合自定义变量(如 URI、文件后缀、请求头等)实现对特定静态文件的并发控制,核心在于把“目标文件特征”作为 key 写入 zone 定义,再在对应 location 中调用 limit_conn。
关键:选对变量做 key,精准锁定目标文件
默认用 $binary_remote_addr 是按 IP 限流,要针对静态文件,就得把文件标识纳入 key。常用且有效的组合有:
-
按文件后缀限制:比如只对
.zip和.iso文件限并发limit_conn_zone $binary_remote_addr$uri zone=zip_iso:10m;
这样同一个 IP 访问不同 .zip 文件会算作不同 key,但同一 .zip 文件被多个 IP 访问也会共用计数 —— 更适合“防单个大文件被刷爆”场景。 -
按完整 URI 限制:比如只对
/download/nginx-1.24.0.tar.gz这个具体文件限流limit_conn_zone $uri zone=single_file:10m;
注意:$uri不含参数,所以/file.zip?a=1和/file.zip?b=2被视为同一个 key。 -
按请求头 + URI 组合限制:比如只允许带特定 token 的用户下载某文件
limit_conn_zone $http_x_download_token$uri zone=tokened_file:10m;
需确保前端或网关透传该 header,否则$http_x_download_token为空,所有请求都归到同一 key。
location 中必须匹配并启用限制
光定义 zone 不起作用,得在真正处理静态文件的 location 块里调用 limit_conn,且 zone 名必须一致:
location ~ \.(zip|iso|tar\.gz)$ {
limit_conn zip_iso 3;
root /var/www/files;
}
这段配置表示:只要请求以 .zip/.iso/.tar.gz 结尾,就启用 zip_iso zone 的并发限制,最多允许 3 个并发连接(针对该 key 组合)。
如果想更细粒度,比如只对某个子目录下的 zip 文件生效,可以写成:
location ^~ /public/releases/ {
limit_conn zip_iso 2;
alias /var/www/releases/;
}
注意共享内存大小与 key 粒度的平衡
key 越具体(比如包含完整 $uri),生成的 key 数量就越多,相同 size 下能存的 key 就越少。例如:
-
zone=perip:10m(仅 IP)→ 可存约 32 万个 IP 计数; -
zone=full_uri:10m(含长 URI)→ 可能只存几千个 key;
一旦 zone 内存耗尽,新请求直接返回 503 Service Temporarily Unavailable。所以建议从 5–10m 起步,上线后观察 nginx -t && nginx -s reload 后的 error log,看是否频繁出现 “limiting connections by zone” 或 “shared memory zone … is full” 提示。
可配合 limit_rate 实现双控
并发限制是“连接数”维度,limit_rate 是“单连接带宽”维度,两者不冲突,可叠加使用:
location ~ \.pdf$ {
limit_conn perip 2;
limit_rate 200k;
try_files $uri =404;
}
效果:每个 IP 最多同时打开 2 个 PDF 连接,每个连接最大下载速度 200KB/s。若用户开 2 个标签页下载同一 PDF,总速就是 400KB/s。

















