门户网站制作运维中屏蔽无用蜘蛛降低服务器压力

user-agent_l.jpg

网站制作上线后,域名就像一个大门一样向全世界都敞开着。但是我们的网站很多时候并不需要面向全球发布,比如企业网站,本身客户只是国内的,那么境外的蜘蛛拼命的访问爬取就是浪费服务器的带宽和资源。更何况,有一部分搜索引擎不按套路出牌,经常性的每秒好多请求过来。

为了解决以上的问题,我们来可以通过判断User-Agent来进行过滤筛选。同时出于安全考虑,我们还会禁止部分非GET,POST等自己网站没有用到的请求方式抓取。

下面我们用Nginx来举例说明(此方式一般只支持云主机部署的网站,虚拟主机的不支持)

禁止Scrapy等工具的抓取

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

禁止指定UA及UA为空的访问

#禁止指定UA及UA为空的访问
if ($http_user_agent ~ "FeedDemon|JikeSpider|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|YisouSpider|HttpClient|MJ12bot|heritrix|EasouSpider|LinkpadBot|Ezooms|^$" )
{  
    return 403;
}

禁止非GET|HEAD|POST方式的抓取

此处可以根据网站制作中涉及到的请求方式灵活修改

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

以上配置完成后重启Nginx加载即可。

测试配置

我们测试可以通过查看实时访问日志来看效果,同时我们也可以采用curl模拟蜘蛛请求。

这个是正确的请求

[root@WEB ~]# curl -I -A "BaiduSpider" www.wzcoder.com
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 14 Nov 2019 01:41:45 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Vary: Accept-Encoding
Set-Cookie: PHPSESSID=rb4kndd2anpc7ifn91a0q2pln6; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Cache-control: private
X-Powered-By: UpStream
X-Frame-Options: SAMEORIGIN

这个是屏蔽生效后的请求

[root@WEB ~]# curl -I -A "AhrefsBot" www.wzcoder.com           
HTTP/1.1 403 Forbidden
Server: nginx
Date: Thu, 14 Nov 2019 01:43:37 GMT
Content-Type: text/html
Content-Length: 146
Connection: keep-alive
Vary: Accept-Encoding


有些同学会说,搜索引擎有时候也在变化,有可能有新的User-Agent出来,那么这个时候我们就要去分析网站日志了。

首先是Nginx配置开启访问日志情况,如在vhosts中修改

server {
    ...
    access_log /data/logs/wzcoder.com.access.log;
    ...
}

开启后我们能正常看到访问日志,如下图

WX20191114-094944@2x.png

我们可以分析访问日志,将一些不想要的都给屏蔽了。


总结

网站做完上线后要时刻关注其状态,出于安全考虑需要进行补丁,优化等,出于自己的资源消耗情况也需要对不必要的请求,非法请求做优化屏蔽。当然,如果老板说咱能用钱解决的简单点,直接上WAF,那当然也是妥妥的!


相关阅读