Nginx对静态资产限流采用精细化策略:按文件后缀匹配+请求速率限流、按Referer/User-Agent区分限流、结合缓存状态动态调整限流强度,并自定义429响应与日志标记。

静态资产(如图片、CSS、JS、字体等)通常体积小、访问频次高,但若被恶意刷取或遭遇爬虫扫荡,仍可能耗尽带宽或压垮源站。Nginx 对静态资产限流,核心思路是:**不一刀切限制所有静态请求,而是按资源类型、来源或行为特征做精细化控制**——既保障正常用户流畅访问,又遏制异常流量。
按文件后缀匹配 + 请求速率限流
这是最常用也最稳妥的方式,适用于绝大多数静态资源服务场景。关键在于精准匹配后缀,并避免影响 HTML 页面本身(因为 HTML 通常不归类为“静态资产”,且需保持可缓存和快速响应)。
- 在
http块中定义限流区域,例如按 IP 限速:
limit_req_zone $binary_remote_addr zone=static_per_ip:10m rate=50r/s;
- 在
location块中匹配常见静态后缀,并启用限流:
location ~* \.(jpg|jpeg|png|gif|webp|css|js|woff2?|ttf|eot|svg|ico)$ {<br> limit_req zone=static_per_ip burst=100 nodelay;<br> expires 1y;<br> add_header Cache-Control "public, immutable";<br>}
-
说明:每 IP 每秒最多 50 个静态资源请求,允许突发 100 个;
nodelay避免排队阻塞,直接拒绝超限请求;配合expires和强缓存头,让 CDN 或浏览器多缓存,减少回源。
按 Referer 或 User-Agent 区分限流
真实用户浏览页面时,静态资源请求通常带合法 Referer(如本站域名);而盗链、爬虫或自动化工具常缺失或伪造 Referer。可据此做差异限流。
- 对无 Referer 或非法 Referer 的请求单独限速更严:
map $http_referer $static_limit_key {<br> default $binary_remote_addr;<br> "~*^(https?://)?(www\.)?example\.com" ""; # 合法来源不限流<br> ~*^$ "$binary_remote_addr"; # 无 Referer 归入限流池<br>}
limit_req_zone $static_limit_key zone=static_no_ref:10m rate=5r/s;
location ~* \.(jpg|png|js|css)$ {<br> limit_req zone=static_no_ref burst=10 nodelay;<br> # 正常请求走上面宽松规则,此处只约束异常来源<br>}
- 注意:Referer 可伪造,不能作为唯一安全依据,但作为辅助维度能显著降低误伤率。
结合缓存状态动态调整限流强度
如果 Nginx 自身已缓存静态资源(如启用了 proxy_cache),可利用 $upstream_cache_status 区分回源请求与缓存命中请求——只对真正打到后端的请求限流,避免重复压制已缓存内容。
- 示例:仅对未命中缓存(MISS/EXPIRED/BYPASS)的静态请求限流:
map $upstream_cache_status $cache_bypass {<br> MISS 1;<br> EXPIRED 1;<br> BYPASS 1;<br> default 0;<br>}
limit_req_zone $binary_remote_addr$cache_bypass zone=static_miss:10m rate=20r/s;
location ~* \.(jpg|css|js)$ {<br> limit_req zone=static_miss burst=30 nodelay;<br> proxy_cache STATIC_CACHE;<br> proxy_cache_valid 200 304 1h;<br>}
- 效果:缓存命中的请求完全不受限;只有穿透缓存、需要回源的请求才触发限流,保护后端更精准。
自定义限流响应,提升可维护性
静态资源被限流时,默认返回 503 或 429,但用户感知差。建议统一返回轻量提示页或空响应,同时记录日志便于分析。
- 配置返回 429 并指定自定义响应:
$limit_rate_status











