服务端的要处理的请求越多,无疑服务端的压力也就越大,尤为是有些请求须要访问一些比较昂贵的资源,例如数据库,服务端的文件等。可是咱们必须知道,在到达服务端的请求中,有些请求时咱们但愿的,例如网站的用户的请求,有些请求实际上是没必要要,甚至是咱们不想要的,为此,咱们要避免这样的请求,节省服务端的资源,从而提升性能。css
搜索引擎html
首先来看看有关搜索引擎的问题。数据库
而后搜索引擎爬到咱们的站点是一件好的事情,不少的SEO能够进行,推广站点。同时,在站点中,有些文件或者资源比较的私密,或者咱们不但愿被搜索引擎请求和收录的,由于每次搜索引擎在请求这些资源的时候,就是发送请求到咱们的站点服务器,势必会加剧服务器的负载。服务器
不须要被搜索引擎请求的文件通常以下:网络
1. 图片资源ide
2. Js脚本,css等性能
3. 一些须要身份验证或者受权才能看的页面(若是页面须要验证以后才能看,搜索引擎收录了也做用不大)网站
咱们能够设置一下,告诉搜索引擎的蜘蛛程序如何爬咱们的站点。搜索引擎
步骤以下:spa
1. 在站点的根目录下面,建立一个robots.txt的文件。
2. 写入文件。若是咱们但愿阻止全部的搜索引擎来爬咱们的站点的页面,那么就能够在文件中写入下面的配置:
User-agent: *
Disallow: /
若是但愿阻止搜索引擎爬某个文件夹,能够配置以下:
User-agent: *
Disallow: /p_w_picpaths/
Disallow: /js/
Disallow: /css/
Disallow: /private/
更有趣的是:对于某些搜索引擎,咱们还能够改变他们的蜘蛛程序爬咱们站点的频率,设置以下:
User-agent: *
Crawl-delay: 10
你们能够去上网找下一些如何影响Google,百度等蜘蛛程序的设置。
热连接问题
就是在A网站上面显示一个来自B网站的图片连接。例如咱们在本身的站点上面有一个连接以下:<img src=”http://www.xxx.com/yyy.gif”/>,那么在别人在浏览咱们的站点的时候,就回去别人的那个站点(http://www.xxx.com/yyy.gif)去请求这个图片,那么势必会消耗他们的服务器的资源。发过来,若是别人在他们的站点上采用了咱们的图片或者其余的连接资料,那么用户在浏览别人的站点的时候就会消耗咱们站点的服务端资源和带宽。
为一个组件就能够阻止这种状况的发生:http://www.iis.net/community/default.
aspx?tabid=34&i=1288&g=6.你们去看看。
验证码(CAPTCHA)
咱们经常在站点中加入一些验证码的功能来防止网络注册机。通常是生成一张有文字的图片,而后根据验证用户输入的文字和图片中的文字是否同样来判断此时的用户是人仍是注册机。
经过验证码阻止了注册机随意的消耗站点资源(若是没有验证码,注册机能够不断的注册信息,大小服务器和数据库资源,并且产生不少的垃圾数据)。
咱们本身写生成验证码的程序,通常经过GDI+来作,同时也能够采用一些第三方的库实现,例如:reCAPTCHA: http://recaptcha.net/,你们上网找下,不少的。
网络刮刀(Scrapers)与Dos
这个问题必须引发重视。若是咱们的站点上面有不少的有用的信息,那么别人可能就可能开发一个程序来到咱们的站点抓取信息,而后把这些内容放到本身的站点上面。例如,不少的内容型的站点天天都从博客园的首页上面来抓取信息,而后放到他们的站点上,增长他们的访问量。
原本站点被搜索引擎抓就有点消耗性能了,若是还被不少的这样的网络刮刀来抓内容,对站点的性能影响可想而知。
若是那些网络刮刀程序的的IP地址变化不频繁,并且请求咱们站点的频率比较的由规律,那么咱们就能够采用一些代码的方式来防止这样的请求。例如,咱们能够监测:同一个IP是否在20min以内发送了100个请求,若是是,咱们就推测:多是别人在抓咱们的站点内容,咱们就拒绝这个IP的请求。
固然了,上面只是一些简单的方法,对于一些复杂的Dos***,上面的监测代码基本没有做用。由于Dos***中,***的IP地址是变化的。
下面咱们就写一些代码来防止简单的网络刮刀程序和简单的Dos***。基本的思想就是:若是在给定的时间段内,若是某个用户的请求不少,超过了必定的数量,那么咱们就认为这个”用户”多是网络刮刀程序,而后就拒绝下面的请求,一段时间以后,再次容许这个从这个IP发出的请求。
下面的代码中:假设若是一个用户在5秒以内发出了100个请求,那么咱们就认为这是网络刮刀程序或者是网站的***者。固然,咱们还考虑这个发送请求的”用户”是不是搜索引擎的蜘蛛程序。(下面的代码只是简单做为演示,不是实际生产的代码,抛砖引玉)
- private const int intervalSeconds = 30;
- private const int maxRequestsInInterval = 5;
若是认为这个”用户”是***者,那么咱们就阻止用户的请求,阻止时间是20秒
- private const int blockedPeriodSeconds = 20;
下面,咱们建立一个类来描述一个访问者的信息。以下:
- private class VisitorInfo
- {
- public int nbrHits;
- public bool blocked;
- public VisitorInfo()
- {
- nbrHits = 1;
- blocked = false;
- }
- }
在BotDefence类中加入一个方法IsBotAttach来判断一个请求是不是***性的请求。以下:
- public static bool IsDosAttack()
- {
- string visitorIP = HttpContext.Current.Request.UserHostAddress;
- VisitorInfo visitorInfo = (VisitorInfo)HttpContext.Current.Cache[visitorIP];
- if (visitorInfo == null)
- {
- HttpContext.Current.Cache.Insert(
- visitorIP, new VisitorInfo(), null,
- DateTime.Now.AddSeconds(intervalSeconds),
- System.Web.Caching.Cache.NoSlidingExpiration);
- }
- else
- {
- if (visitorInfo.blocked)
- {
- return true;
- }
- visitorInfo.nbrHits++;
- if (visitorInfo.nbrHits > maxRequestsInInterval)
- {
- visitorInfo.blocked = true;
- HttpContext.Current.Cache.Insert(
- visitorIP, visitorInfo, null,
- DateTime.Now.AddSeconds(blockedPeriodSeconds),
- System.Web.Caching.Cache.NoSlidingExpiration);
- return true;
- }
- }
- return false;
- }
上面的代码都是自解释的,很容易看懂,就不赘述了。
原文连接:http://www.cnblogs.com/yanyangtian/archive/2011/02/16/1955693.html