Nginx中通过map指令识别爬虫类型并差异化缓存与限流:对Googlebot等合法爬虫启用长缓存(1h)和宽松限流(2r/s),对Scrapy等恶意爬虫直接403并限速0.1r/s,对未知爬虫禁HTML缓存且返回429。

在 Nginx 中设置针对爬虫的缓存访问限制,核心思路是「区别对待」:对合法搜索引擎爬虫(如 Googlebot、Baiduspider)合理缓存、放行;对恶意或高频爬虫则限速、降级缓存甚至拒绝响应。这不是单一配置能解决的问题,而是组合策略。
识别并分类爬虫流量
用 map 指令提前标记请求类型,避免在每个 location 中重复判断:
<!-- 在 http 块中定义 -->
map $http_user_agent $crawler_type {<br> default "normal";<br> ~*(Googlebot|Baiduspider|YandexBot) "good";<br> ~*(Scrapy|python-requests|curl|wget|HttpClient) "bad";<br> ~*(bot|crawler|spider) "unknown";<br>}
这样后续所有规则都能基于 $crawler_type 做精准控制,比如只给 "good" 爬虫启用长时效缓存,而对 "bad" 直接跳过缓存并限流。
为不同爬虫配置差异化缓存策略
利用 proxy_cache_valid 和 proxy_cache_bypass 实现分级缓存:
- 对合法爬虫(
$crawler_type = "good"),缓存 HTML 页面 1 小时,静态资源缓存更久 - 对未知或可疑爬虫(
$crawler_type = "unknown"),强制不缓存 HTML(设为 0s),仅缓存图片/CSS/JS 等静态资源 - 对明确恶意爬虫(
$crawler_type = "bad"),完全绕过缓存:proxy_cache_bypass 1;并返回轻量响应或 403
示例片段:
location / {<br> proxy_pass http://backend;<br> proxy_cache my_cache;<br> # 合法爬虫走长缓存<br> if ($crawler_type = "good") {<br> proxy_cache_valid 200 1h;<br> }<br> # 恶意爬虫不进缓存<br> if ($crawler_type = "bad") {<br> proxy_cache_bypass 1;<br> return 403;<br> }<br> # 其他情况默认缓存 5 分钟<br> proxy_cache_valid 200 5m;<br>}配合限流防止缓存穿透与压垮后端
即使开了缓存,恶意爬虫仍可能通过构造随机参数(如 ?t=123)绕过缓存,直接打到后端。因此必须叠加请求频率限制:
- 为
$crawler_type = "bad"单独建限流区,速率压到极低(如 0.1r/s) - 对
"unknown"类爬虫启用 burst 缓冲,但超限后返回 429 - 允许
"good"爬虫有更高配额(如 2r/s),体现对合规爬虫的友好
配置示意:
limit_req_zone $binary_remote_addr$crawler_type zone=spider_limit:10m rate=1r/s;<br>location / {<br> limit_req zone=spider_limit burst=3 nodelay;<br> # 更细粒度可在此处加 if 判断 $crawler_type 再调用不同 zone<br>}
补充:用 robots.txt 引导合规爬虫
缓存策略再强,也需配合语义层规范。在 root 下配置 /robots.txt 明确告知哪些路径可爬、哪些应避开:
location = /robots.txt {<br> alias /var/www/static/robots.txt;<br>}
内容示例:
User-agent: *<br>Disallow: /admin/<br>Disallow: /api/<br>Allow: /public/<br><br>User-agent: Googlebot<br>Allow: /<br>Crawl-delay: 2
注意:Nginx 不会自动读取 robots.txt 执行限制,但它会影响搜索引擎是否抓取——这是缓存优化的前提:减少无效请求,让缓存真正服务有价值流量。


















