nginx静态资源流量整形需精准作用于静态路径而非全局,通过location正则匹配扩展名(如.jpg、.js),结合limit_req_zone按ip限速、burst控制突发请求,并叠加limit_conn_zone限制单ip并发连接数,再按资源类型(js/css/图片)分设不同限速策略,同时确保限速与缓存配置协同生效。

在 Nginx 中实现静态资源的流量整形,核心是**把限速逻辑精准施加在静态资源请求路径上**,而不是全局或整个站点。这样既能保护后端(比如 CDN 回源带宽、磁盘 I/O 或上游存储),又能避免影响动态接口或管理路径。
只对静态文件路径做限速
静态资源通常有明确的扩展名特征(如 .jpg、.js、.css、.woff2 等),可通过 location 正则匹配单独控制:
- 在 http 块中定义限速区域,例如按 IP 限速:
- 在 server 块内,用正则 location 匹配静态资源,并启用限速:
limit_req zone=static_limit burst=10 nodelay;
expires 1y;
add_header Cache-Control "public, immutable";
}
这里 burst=10 nodelay 表示允许最多 10 个突发请求立即通过,不排队;适合应对小范围瞬时下载高峰,又不至于让单个用户拖垮带宽。
结合连接数限制防大文件压垮服务
单个用户并发下载多个大图或视频,可能耗尽 worker_connections。建议叠加连接数限制:
- 先定义连接限制区域:
- 在同个静态 location 中添加:
即:每个 IP 最多同时建立 3 个到该静态路径的连接。这对防止迅雷式多线程下载特别有效。
区分资源类型设置不同策略
不是所有静态资源都该一视同仁。例如:
- 小图标(.ico)、字体(.woff2)可设更宽松的速率(如 20r/s)和更高 burst(30);
- 高清图片(.jpg/.png)或视频片段(.mp4)建议更低速率(如 2r/s)+ 更小 burst(3),并配合 limit_conn;
- 可为关键 JS/CSS 单独建 zone,避免被图片请求挤占额度。
示例:
limit_req_zone $binary_remote_addr zone=js_css:10m rate=15r/s;limit_req_zone $binary_remote_addr zone=img:10m rate=2r/s;
location ~* \.(?:js|css)$ { limit_req zone=js_css burst=20; }
location ~* \.(?:jpg|jpeg|png|webp)$ { limit_req zone=img burst=3; limit_conn conn_per_ip 2; }
注意缓存与限速的协同关系
限速作用于“未命中缓存”的请求。如果静态资源已配置了 long expires(如 1y)且客户端/CDN 缓存生效,真实到达 Nginx 的请求数会大幅减少——这意味着限速阈值可以设得更保守。
- 务必确认 expires 和 Cache-Control 已正确配置;
- 对不希望被缓存的资源(如带版本号但实际不变的 /static/app.js?v=1.2.3),可考虑用 $args 参与限速 key,避免同一 URL 被反复限速;
- 若使用 proxy_cache 或 fastcgi_cache,限速应放在 cache 指令之前,确保未缓存请求也被管控。
不复杂但容易忽略











