Nginx限制爬虫并发配置:别让烂爬虫拖死服务器:Nginx限流实战

Nginx限制爬虫并发配置:别让烂爬虫拖死服务器:Nginx限流实战

技术运维wl5net2026-11-13 4:30:54A+A-
约 3277 字 · 预计阅读 7 分钟

做站长这些年,最怕的不是没流量,而是那种带毒的“垃圾流量”。凌晨三点,手机告警狂响,登上一看,CPU直接飙到99%,日志里全是某不知名爬虫在疯狂扫你的接口。这种时候,如果你还没搞好 Nginx限制爬虫并发配置,那服务器基本就成了“裸奔”。今天不讲那些虚头巴脑的官方文档,咱们就聊聊作为一名老站长,在实战中是怎么通过 Nginx 给爬虫套上“紧箍咒”的。

Nginx限制爬虫并发配置:别让烂爬虫拖死服务器:Nginx限流实战

为什么非要做 Nginx 限流?

很多新手站长有个误区,觉得爬虫越多越好,代表 SEO 权重高。兄弟,醒醒吧!除了 Google、Bing、百度这些正经搜索引擎的蜘蛛,市面上 80% 的爬虫都是“小偷”或者“暴力采集器”。

它们不讲武德,一秒钟能给你怼上百个请求,直接把数据库连爆。这时候,如果不针对特定的 User-Agent 进行 Nginx限制爬虫并发配置,你的正常用户访问就会卡得像 PPT。我们做限流的目的很明确:保住正常用户体验,精准打击恶意采集。


第一步:精准识破——利用 Map 定义“流氓名单”

别上来就全局限流,那样会误伤友军。我们要先把那些消耗资源大、又不给带流量的爬虫揪出来。在 Nginx 的 http 模块里,我们可以利用 map 指令定义一个变量。

实操配置案例:

map $http_user_agent $is_bot {
    default 0;
    ~* (Scrapy|HttpClient|Java|Python|AhrefsBot|DotBot|SemrushBot) 1;
}
  • 用法解析:这段代码的意思是,如果 User-Agent 里包含了 Scrapy、Python、Ahrefs 等关键词,就把 $is_bot 变量设为 1。
  • 适用场景:当你发现 Ahrefs 或者某些 Python 脚本在疯狂爬取你的外贸独立站时,这一招最管用。
  • 避坑点:千万别把 Googlebot 或 Baiduspider 写进去,除非你不想在搜索引擎混了。

第二步:划定红线——配置 limit_req_zone

有了名单,接下来得定规则。Nginx 提供了两个核心模块:limit_req(限请求频率)和 limit_conn(限并发连接数)。

1. 限制请求速率(频率)

在 http 块中定义:

# 这里的 $is_bot_addr 是为了只对爬虫生效,不对普通用户生效
map $is_bot $is_bot_addr {
    1 $binary_remote_addr;
    0 "";
}

limit_req_zone $is_bot_addr zone=bot_req_limit:10m rate=1r/s;
  • 方案例句:“针对这拨流氓爬虫,每秒只准请求一次(rate=1r/s),多出的直接踢掉。”
  • 核心逻辑:这里我耍了个小花招,如果 $is_bot 为 0(正常用户),变量就是空,Nginx 不会计数;只有爬虫会被丢进 bot_req_limit 这个池子里。

2. 限制并发连接数

limit_conn_zone $is_bot_addr zone=bot_conn_limit:10m;
  • 用法:限制同一个爬虫 IP 同时能建立多少个连接。

第三步:落地执行——在 Server/Location 块应用

光定义了规则没用,还得实地挂载到你的网站配置里。

综合应用示例:

server {
    listen 80;
    server_name www.yourdomain.com;

    location / {
        # 应用请求频率限制,允许 5 个请求的缓冲(burst)
        limit_req zone=bot_req_limit burst=5 nodelay;
        # 应用并发连接限制,一个爬虫 IP 最多开 2 个连接
        limit_conn bot_conn_limit 2;

        # 针对超限后的返回状态码,建议 429
        limit_req_status 429;

        proxy_pass http://backend_server;
    }
}

避坑指南:

  1. 关于 Burst 参数:burst=5 就像是一个缓冲区。爬虫如果瞬间发了 6 个请求,前 5 个会排队处理,第 6 个才报错。如果不加 nodelay,排队的请求会很慢;加了 nodelay,只要在 5 个以内,就按正常速度处理。
  2. 状态码选 429 还是 503?:以前很多人喜欢用 503,但我推荐 429 (Too Many Requests)。这明确告诉爬虫:你太快了,歇会儿再来。对 SEO 更加友好,蜘蛛看到 429 会知道是限流,而不是你服务器挂了。

进阶技巧:写给文案与 SEO 的“防采集”软文

有时候,纯靠技术手段拦截还不够,因为高级爬虫会换 IP、改 User-Agent。这时候,老站长会配合一些“文案陷阱”。

1. 隐藏的蜜罐链接

在页面代码里放一个隐藏的 <a> 标签,用户看不见,但爬虫会顺着爬。

  • 文案标题:Stop scraping my content!(虽然没啥卵用,但能标识出它是爬虫)。
  • 实操方案:只要有 IP 访问了这个特定的 URL,直接在 Nginx 层通过脚本永久封禁。

2. 动态内容干扰

对于一些核心的价格、库存数据,不要直接写死在 HTML 里。

  • 避坑点:纯 JS 渲染对 SEO 有点挑战,建议配合 Server Side Rendering (SSR)。
  • 文案提示:当检测到并发过高时,给对方展示一行文字:“由于访问过于频繁,数据已加密,请登录后查看。”

日志监控:到底谁被拦住了?

配置完 Nginx限制爬虫并发配置 后,千万别以为万事大吉了。你得看日志,看看有没有误伤。

实时查看拦截情况:

tail -f /var/log/nginx/error.log | grep "limiting requests"

如果你在日志里看到了大量正常用户的 IP 被拦住了,那说明你的 rate 设置得太严苛了。

推荐的针对不同爬虫的文案策略:

  • 对待 Google/Bing:放行,但如果它们抓取太猛(比如在凌晨备份期间),去 Search Console 里手动调低抓取频率。
  • 对待 Ahrefs/Semrush:建议直接在 robots.txt 封掉,或者 Nginx 限制到 rate=1r/m(每分钟一次),因为这些工具除了暴露你的商业机密,没啥大用。
  • 对待恶意 Python/Go 脚本:直接 return 444;。这是 Nginx 的绝招,不返回任何头信息,直接断开连接,省流量省到极致。

总结:老站长的肺腑之言

做 SEO 和运维这么多年,我明白一个道理:防守是有限度的,成本是关键。

你不需要把所有的爬虫都堵死,那样太累。合理的 Nginx限制爬虫并发配置 是为了给服务器留一口气,让它在面对突发采集流量时不会宕机。

  1. Map 模块 精准画像。
  2. limit_req 细水长流。
  3. limit_conn 封顶死磕。
  4. 429 状态码 文明回绝。

如果你还在为服务器经常卡顿发愁,赶紧回去翻翻 Nginx 配置文件。别等服务器爆了才后悔没给那些贪婪的爬虫戴上“脚镣”。咱们做站的,守得住寂寞,更要守得住服务器。

SEO 提醒:本文虽然讲的是技术配置,但在实际操作中,请务必保证 Googlebot 的畅通无阻,否则你的排名可能会像过山车一样掉到底。技术是手段,赚钱和流量才是目的,别搞反了!

点击这里复制本文地址 以上内容由未来技术网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

网站地图 robots.txt 网站死链 关于本站 工信部备案号浙ICP备2026012592号-2 浙公网安备33102402000669号