最近几天连续收到网站监控报警,发现数据库把cpu 吃满了。各种检查,各种重启半天没有任何效果。最终,统计了access.log 才发现,是各路搜索引擎的爬虫请求把系统资源吃完了。统计了某一时间段请求量:

  • facebookexternalhit —— 8947
  • bingbot —— 8278
  • SemrushBot —— 6108
  • googlebot —— 1107

然后,浏览了一下用户的来源数据,来自fecebook和Semrush的基本没有,虽然我也不知道他们搞bot 干嘛,但既然对我没好处,就直接屏蔽了把。于是在robots.txt 中加入

User-Agent: facebookexternalhit
Disallow: /

User-agent: SemrushBot
Disallow: /

User-agent: SemrushBot-SI
Disallow: /

效果立竿见影,数据库CPU的占有率从70+% 下降到 30%左右。今天又学到一课。

进一步观察日志,发现,facebookexternalhit并没有遵守robots.txt ,于是在nginx配置中加上了如下代码:

if ($http_user_agent ~ "facebookexternalhit"){
    return 301 "https://www.facebook.com";
}

然后数据库的cpu占用,降到了接近个位数。

总结,最大的坑莫过于facebook的爬虫,似乎facebook发现这是一个 wordpress站点,于是开始使用“/?p=363258”这样的路径遍历所有文章,而不是通过sitemap 或者页面间的链接关系。于是产生的大量的重定向,和数据库查询。并且我没有在facebook设置站点也没打算从中获得任何流量为什么死命爬目前依然是未解之谜。