Nginx 通过差异化限速保护静态资源:按后缀(如 jpg/png)、路径(如 /uploads/)和来源(如 CDN/爬虫)分别配置 limit_req,结合白名单、缓存与日志实现精准防护。

在 Nginx 中限制静态资源访问频率,核心不是“一刀切”地压低所有请求,而是按资源类型、路径或来源做差异化限速,既防恶意下载(如爬虫批量抓图、盗链 JS/CSS),又不干扰浏览器正常预加载、CDN 回源和合法用户访问。
按文件后缀精准限速
对高频被滥用的资源(如图片、字体、压缩包)单独设限,避免影响 HTML 或 API:
- 用大小写不敏感正则匹配扩展名:location ~* .(jpg|jpeg|png|gif|webp)$
- 定义独立限速区,以 IP 为键更合理(防单 IP 扫描):limit_req_zone $binary_remote_addr zone=img_limit:10m rate=8r/s;
- 在 location 中启用并设置缓冲:limit_req zone=img_limit burst=20 nodelay; —— 允许短时突发,但超量立即拒绝,不排队
- 对 .zip/.pdf/.exe 等易被恶意下载的资源,可进一步收紧:rate=2r/s; burst=5;
按目录结构分区域限速
如果静态资源有清晰部署路径(如 /static/、/uploads/),优先用 ^~ 前缀匹配,性能更高、逻辑更稳:
- location ^~ /uploads/ {
- limit_req zone=upload_limit burst=10 nodelay;
- expires 1h; —— 配合缓存头,降低重复请求压力
- }
- 对应在 http 块中定义:limit_req_zone $binary_remote_addr zone=upload_limit:10m rate=5r/s;
放行可信来源,避免误伤
CDN 节点、搜索引擎爬虫、监控探针常高频请求静态资源,需白名单豁免:
- 用 map 指令构造动态键:map $http_user_agent $limit_key { default $binary_remote_addr; ~*Cloudflare “”; ~*Googlebot “”; }
- 基于该键建限速区:limit_req_zone $limit_key zone=asset_limit:10m rate=30r/s;
- 再在 location 中引用:limit_req zone=asset_limit burst=60;
- 也可直接跳过 favicon.ico 和 robots.txt:location = /favicon.ico { access_log off; log_not_found off; }
配合缓存与日志验证效果
限速只是手段,必须搭配可观测性和防御纵深:
- 静态资源务必加强缓存策略:add_header Cache-Control “public, max-age=31536000, immutable”;(尤其带哈希版本号的 JS/CSS)
- 禁用对带版本号资源(如 app.a1b2c3.js)的过度限速,否则热更新可能失败
- 开启限流日志便于排查:limit_req_log_level warn;,并在 log_format 中加入 $limit 变量记录是否触发限速
- 上线前用 ab 或 wrk 模拟攻击流量测试,确认 503 响应符合预期,且正常页面浏览不受影响
文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/xitongjiaocheng/123747.html