服務端的要處理的請求越多,無疑服務端的壓力也就越大,尤爲是有些請求須要訪問一些比較昂貴的資源,例如數據庫,服務端的文件等。可是咱們必須知道,在到達服務端的請求中,有些請求時咱們但願的,例如網站的用戶的請求,有些請求實際上是沒必要要,甚至是咱們不想要的,爲此,咱們要避免這樣的請求,節省服務端的資源,從而提升性能。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