nginx 之 禁用不必要的爬虫与蜘蛛

nginx 禁止某些非法访问的蜘蛛与爬虫,避免过度浪费服务器的资源。。

曾经有时候注意到,网站经常有异常的访问,并且是带有攻击性的访问以及扫描。从而使用服务器的宽带,以及资源被大量消耗,对于正常访问的用户造成影响。

这种情况,对于一些性能很好的服务器,以及带宽很大的机器,可能影响不大,可是对于我们这些个人站长,以及小型公司来讲的,并没有那么大的成本是去投入到宽带以及服务器硬件上。

对此,我们一般通过两种方法来屏蔽。

  • 第一种,使用 robots.txt 文件来阻止。

robots 协议,也称为爬虫协议,机器人协议等等,全称是“网络爬虫排除标准”(Robots Exclusion Protocol),我们可以通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。

这个文件是一个文本文件,书写规则如下:

User-agent: *
Disallow: /admin
Disallow: /?s=*
Disallow: /service
Disallow: /user/*.jsp

User-agent: Baiduspider
Disallow: /admin
Disallow: /vip

User-agent: Googlebot
Disallow: /

User-agent 指定的是机器人类型,比如百度,谷歌的抓取程序,这个名称,可以上搜索,而 Disallow 则是表示禁止抓取哪些页面,这个可以使用通配符

文件写好以后,上传到网站根目录即可。

PS:文件名必须为 robots.txt 并且要全部小写,只能放到网站根目录,其它目录不生效。

搜索引擎本着自觉自愿的原则对待网站 robots 协议。并不是所有搜索引擎都会遵守这类请求。所以,还有很多流氓蜘蛛,那么针对流氓,使用 robots 协议,就不管用了,因为它不并不遵守,所以要使用第二种方法。

  • 第二种方法,使用 nginx 来禁止特定 UA (user agent)访问。

思路就是,利用 Ningx 配置特定的 UA 规则,当有异常访问,触发规则我们所定义的规则,Nginx 直接返回某个静态页面,或者返回特定http 状态码(如:403,404, 500等),从而达到拒绝访问,这样不会被转发到后面的动态语言上处理,而处理静态页面,或者返回特定http 状态码,这是nginx 的强项,几乎可以不对系统造成资源浪费。

而实现原理,则是通过 UA (user agent)来判断,不符合的,返回 403 状态码,或者 500系列状态码

先看一个简单的例子:

if ($http_user_agent ~* "baiduspider")
{
    return 403;
}

这段代码,可以写到 server {} 区域段里面,也可以写到 location {} 区段内,在 server {} 则是对整个站点都生效,而放到 location {} 则只对 location 匹配到的路径生效。

if 做为判断,$http_user_agentnginx 的一个内部变量,从名称来讲,就已经可以看出来了,这个指的是 UA~* 则表示,不区分大小写,如果要区分大小写,则只写一个 ~ ,而双引号里面的,就是我们要禁止的UA,例子中是百度。

return 则定义了 nginx 在匹配到 引号内的UA时,返回的http状态码。本例写了403,也就是拒绝访问。

禁止多个UA,使用 | 分隔,例子如下:

if ($http_user_agent ~* "Baiduspider|Googlebot")
{
    return 403;
}

另外在本站中,之前我也发现过,访问的 UA 为空,这肯定不是正常的访问者了,因为没有浏览器会不带UA,禁止为空的UA,则是 ^$

if ($http_user_agent ~* "^$")
{
    return 403;
}

在 机器人UA的名称当中,其大部分,可以在网上查到,也可以定期查看 nginx 的访问日志,来找到

以下再写个别从网上借鉴的例子,仅供参考

#禁止Scrapy等工具的抓取
if ($http_user_agent ~* "Scrapy|Curl|HttpClient|Teleport|TeleportPro") 
{
    return 403;
}

#禁止指定UA及UA为空的访问
if ($http_user_agent ~* "FeedDemon|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|HttpClient|heritrix|EasouSpider|Ezooms|WBSearchBot|Elefent|psbot|SiteExplorer|MJ12bot|larbin|TurnitinBot|wsAnalyzer|ichiro|YoudaoBot|^$" )
{
    return 403;
}

#禁止非GET|HEAD|POST方式的抓取
if ($request_method !~ ^(GET|HEAD|POST)$) {
    return 403;
}

 

猜您喜欢