聊聊如何挡住网站被大规模分布式爬虫频繁抓取导致服务器负载非常高网站时不时打不开的经历

4 阅读3分钟

聊聊如何挡住网站被大规模分布式爬虫频繁抓取导致服务器负载非常高网站时不时打不开的经历

本文谈的大规模分布式爬虫,就是IP总量很多,但每个IP访问的次数很少,其中有很多是少于5次的

公司网站是一个做跨境电商的网站,昨天是26.4.24日,有大量的流量,一秒的时间有10次左右同时抓取/store下的页面,加上其他目录下的页面并发量就更大了,这个目录下的页面有较复杂的SQL查询,使得服务器负载高,达到10+,有时更高,网站时不时打不开。

昨天主要通过以下措施来挡住恶意流量:

  • 通过 nginx 访问日志看UA,有没有异常的,发给AI分析,再在nginx配置文件中写正则,把符合条件的UA拒绝提供内容。(因异常UA只占一小部分,收效甚微)
  • 通过开启 页面缓存,并缓存 30 天。(之前没开启缓存,刚开始还是绝大多数请求打到后端php层,收效甚微)
  • 通过 防火墙 (iptables)挡住异常的IP。(因为IP太多了,收效甚微)
  • 通过Cloudflare Turnstile

Cloudflare Turnstile的流程

用的是隐性小部件 widget,隐性的是最简单的,只需要在前端页面(服务器端渲染)加引入js文件、一个js函数、和一个html组件,它的特点是,它会在独立页面自动检测是否正常,正常的话,它会自动打上绿色的勾并自动提交给后端,用户都不用动什么。

  • 注册 Cloudflare Turnstile,获得 站点密钥 和密钥,其中前者用于前端页面,后者用于 后端php 代码中

前端

  • 创建一个独立HTML页面,主要包含 div 小部件

  • Cloudflare Turnstile提供的 js

  • 一个 小部件即一个 div 容器,并通过属性定义JS回调

  • 在 js 回调中,主要把 token 作为表单参数提交到 php 后端,然后根据 后端的返回结果决定是否跳转到实际的内容,这个token是cloudflare生成的。

后端

  • 在/store 页面加 一段代码,如果有某个cookie则正常访问,如果没有则给 Cloudflare Turnstile的验证页面

  • 接收前端提交过来的 token ,并提交给 Cloudflare验证,它会返回成功或失败,如果验证成功,则写入 cookie

  • 把上一步的信息返回给前端,前端收到成功的验证信息,跳转到正常内容的页面

通过 Cloudflare Turnstile 挡住恶意流量,效果可行,最高负载不超过2,挡住了大部分恶意流量,网站访问完全正常,感到很开心,要不然没解决的话自己内心的压力是较大的,因为网站打不开客户下不了单同时也会影响业务员的KPI,现在终于可以安心一段时间了

希望对你有帮助,如果你的网站也遇到类似的问题,欢迎带着具体问题与我交流。我的知乎私信或微信:ru_huan