服務端的要處理的請求越多
無疑服務端的壓力也就越大
尤其是有些請求需要訪問一些比較昂貴的資源
例如數據庫
服務端的文件等
但是我們必須知道
在到達服務端的請求中
有些請求時我們希望的
例如網站的用戶的請求
有些請求其實是不必要
甚至是我們不想要的
為此
我們要避免這樣的請求
節省服務端的資源
從而提高性能
搜索引擎
首先來看看有關搜索引擎的問題
然後搜索引擎爬到我們的站點是一件好的事情
很多的SEO可以進行
推廣站點
同時
在站點中
有些文件或者資源比較的私密
或者我們不希望被搜索引擎請求和收錄的
因為每次搜索引擎在請求這些資源的時候
就是發送請求到我們的站點服務器
勢必會加重服務器的負載
不需要被搜索引擎請求的文件一般如下
圖片資源
Js腳本
css等
一些需要身份驗證或者授權才能看的頁面(如果頁面需要驗證之後才能看
搜索引擎收錄了也作用不大)
我們可以設置一下
告訴搜索引擎的蜘蛛程序如何爬我們的站點
步驟如下
在站點的根目錄下面
創建一個robots
txt的文件
寫入文件
如果我們希望阻止所有的搜索引擎來爬我們的站點的頁面
那麼就可以在文件中寫入下面的配置
User
agent: *
Disallow: /
如果希望阻止搜索引擎爬某個文件夾
可以配置如下
User
agent: *
Disallow: /images/
Disallow: /js/
Disallow: /css/
Disallow: /private/
更有趣的是
對於某些搜索引擎
我們還可以改變他們的蜘蛛程序爬我們站點的頻率
設置如下
User
agent: *
Crawl
delay:
大家可以去上網找下一些如何影響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 = 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;
}
上面的代碼都是自解釋的
很容易看懂
就不贅述了
當然了
上面的代碼很簡單
我們可以保存每個請求IP的地址
然後分析
相關的方法網絡上面有很多
大家自己找!
本篇就到這裡了
下一章就詳細的講述如何解決內存的性能瓶頸
敬請關注
From:http://tw.wingwit.com/Article/program/net/201311/12823.html