服务端的要处理的请求越多无疑服务端的压力也就越大尤其是有些请求需要访问一些比较昂贵的资源例如数据库服务端的文件等但是我们必须知道在到达服务端的请求中有些请求时我们希望的例如网站的用户的请求有些请求其实是不必要甚至是我们不想要的为此我们要避免这样的请求节省服务端的资源从而提高性能 搜索引擎 首先来看看有关搜索引擎的问题 然后搜索引擎爬到我们的站点是一件好的事情很多的SEO可以进行推广站点同时在站点中有些文件或者资源比较的私密或者我们不希望被搜索引擎请求和收录的因为每次搜索引擎在请求这些资源的时候就是发送请求到我们的站点服务器势必会加重服务器的负载 不需要被搜索引擎请求的文件一般如下 图片资源 Js脚本css等 一些需要身份验证或者授权才能看的页面(如果页面需要验证之后才能看搜索引擎收录了也作用不大) 我们可以设置一下告诉搜索引擎的蜘蛛程序如何爬我们的站点 步骤如下 在站点的根目录下面创建一个robotstxt的文件 写入文件如果我们希望阻止所有的搜索引擎来爬我们的站点的页面那么就可以在文件中写入下面的配置 Useragent: * Disallow: / 如果希望阻止搜索引擎爬某个文件夹可以配置如下 Useragent: * Disallow: /images/ Disallow: /js/ Disallow: /css/ Disallow: /private/ 更有趣的是对于某些搜索引擎我们还可以改变他们的蜘蛛程序爬我们站点的频率设置如下 Useragent: * Crawldelay: 大家可以去上网找下一些如何影响Google百度等蜘蛛程序的设置 热链接问题 就是在A网站上面显示一个来自B网站的图片链接例如我们在自己的站点上面有一个链接如下<img src=/>那么在别人在浏览我们的站点的时候就回去别人的那个站点()去请求这个图片那么势必会消耗他们的服务器的资源发过来如果别人在他们的站点上采用了我们的图片或者其他的链接资料那么用户在浏览别人的站点的时候就会消耗我们站点的服务端资源和带宽 为一个组件就可以阻止这种情况的发生 aspx?tabid=&i=&g=大家去看看 验证码(CAPTCHA) 我们常常在站点中加入一些验证码的功能来防止网络注册机一般是生成一张有文字的图片然后根据验证用户输入的文字和图片中的文字是否一样来判断此时的用户是人还是注册机 通过验证码阻止了注册机随意的消耗站点资源(如果没有验证码注册机可以不断的注册信息大小服务器和数据库资源而且产生很多的垃圾数据) 我们自己写生成验证码的程序一般通过GDI+来做同时也可以采用一些第三方的库实现例如reCAPTCHA: 大家上网找下很多的 网络刮刀(Scrapers)与Dos 这个问题必须引起重视如果我们的站点上面有很多的有用的信息那么别人可能就可能开发一个程序来到我们的站点抓取信息然后把这些内容放到自己的站点上面例如很多的内容型的站点每天都从博客园的首页上面来抓取信息然后放到他们的站点上增加他们的访问量 本来站点被搜索引擎抓就有点消耗性能了如果还被很多的这样的网络刮刀来抓内容对站点的性能影响可想而知 如果那些网络刮刀程序的的IP地址变化不频繁而且请求我们站点的频率比较的由规律那么我们就可以采用一些代码的方式来防止这样的请求例如我们可以监测同一个IP是否在min之内发送了个请求如果是我们就推测可能是别人在抓我们的站点内容我们就拒绝这个IP的请求 当然了上面只是一些简单的方法对于一些复杂的Dos攻击上面的监测代码基本没有作用因为Dos攻击中攻击的IP地址是变化的 下面我们就写一些代码来防止简单的网络刮刀程序和简单的Dos攻击基本的思想就是如果在给定的时间段内如果某个用户的请求很多超过了一定的数量那么我们就认为这个用户可能是网络刮刀程序然后就拒绝下面的请求一段时间之后再次允许这个从这个IP发出的请求 下面的代码中假设如果一个用户在秒之内发出了个请求那么我们就认为这是网络刮刀程序或者是网站的攻击者当然我们还考虑这个发送请求的用户是否是搜索引擎的蜘蛛程序(下面的代码只是简单作为演示不是实际生产的代码抛砖引玉) private const int intervalSeconds = ; private const int maxRequestsInInterval = ; 如果认为这个用户是攻击者那么我们就阻止用户的请求阻止时间是秒 private const int blockedPeriodSeconds = ; 下面我们创建一个类来描述一个访问者的信息如下 代码 private class VisitorInfo { public int nbrHits; public bool blocked; public VisitorInfo() { nbrHits = ; blocked = false; } } 在BotDefence类中加入一个方法IsBotAttach来判断一个请求是否是攻击性的请求如下 代码 public static bool IsDosAttack() { string visitorIP = HttpContextCurrentRequestUserHostAddress; VisitorInfo visitorInfo = (VisitorInfo)HttpContextCurrentCache[visitorIP]; if (visitorInfo == null) { HttpContextCurrentCacheInsert( visitorIP new VisitorInfo() null DateTimeNowAddSeconds(intervalSeconds) SystemWebCachingCacheNoSlidingExpiration) } else { if (visitorInfoblocked) { return true; } visitorInfonbrHits++; if (visitorInfonbrHits > maxRequestsInInterval) { visitorInfoblocked = true; HttpContextCurrentCacheInsert( visitorIP visitorInfo null DateTimeNowAddSeconds(blockedPeriodSeconds) SystemWebCachingCacheNoSlidingExpiration) return true; } } return false; } 上面的代码都是自解释的很容易看懂就不赘述了 当然了上面的代码很简单我们可以保存每个请求IP的地址然后分析相关的方法网络上面有很多大家自己找! 本篇就到这里了下一章就详细的讲述如何解决内存的性能瓶颈敬请关注 |