實戰ASP.NET大規模網站架構:Web加速器
大規模網站瓶頸之一就是性能問題,如何讓你的網站飛速運轉起來,一直是架構師和開發人員苦于思考的問題。文章將針對基于ASP.NET開發的網站交互性非實時部分進行討論。
一、WEB加速通常有如下方案:
1、基于ASP.NET技術的頁面緩存
基于ASP.NET技術的頁面緩存,通常有如下兩種應用方式:
一、基于數據庫觸發(設置緩存依賴策略,當數據庫中數據發生變化時,觸發緩存失效;但微軟提供的解決方案目前僅支持SQL Server,如果是ORACLE需要自己實現觸發接口)。
二、基于文件依賴的策略(可以設置緩存依賴于文件中的具體鍵值,當數據更新時,更新文件鍵值迫使緩存失效)。
優點:實現比較簡單
缺點:粒度太粗,對IIS、.NET Framework依賴太強,策略還不太完善,跨機器、集群訪問方面存在瓶頸。
2、頁面靜態化
頁面靜態化有可分為全部靜態化、局部靜態化、偽靜態化等。
優點:頁面靜態化后,減輕了數據訪問的負擔,同時由于靜態頁面不需要復雜處理過程(如ASP.NET頁面生命周期),從而提高網站的性能。
缺點:頁面靜態化增加了維護管理的復雜度,可能同一頁面在多個頁面之間被引用,需要進行觸發級連更新。當大量并發時,更新靜態頁面會發生LOCK,導致頁面訪問超時。
3、基于squid for windows下的反向代理
為了佐證本方案是經過實踐考驗的,并且是通用的行業方案,以下是一些大規模網站實際應用:
--網易
Server nginx
Date Wed, 10 Mar 2010 02:25:39 GMT
Content-Type text/html; charset=GBK
Last-Modified Wed, 10 Mar 2010 02:24:45 GMT
Vary Accept-Encoding
Expires Wed, 10 Mar 2010 02:27:39 GMT
Cache-Control max-age=120
Content-Encoding gzip
Age 49
X-Cache HIT from cache.163.com
Via 192.168.51.39.nginx, 1.0 cache.163.com (squid/3.0.STABLE23)
Connection close
--騰訊
Server nginx/0.6.39
Date Wed, 10 Mar 2010 02:26:48 GMT
Content-Type text/html; charset=GB2312
Vary Accept-Encoding, Accept-Encoding
Expires Wed, 10 Mar 2010 02:41:48 GMT
Cache-Control max-age=900
Content-Encoding gzip
Age 313
X-Cache HIT from rainny.qq.com
Via 1.0 rainny.qq.com:80 (squid/2.6.STABLE5)
Connection close
----搜狐
Date Wed, 10 Mar 2010 02:41:40 GMT
Server Apache/1.3.39 (Unix) mod_gzip/1.3.26.1a
Vary Accept-Encoding,X-Up-Calling-Line-id,X-Source-ID,X-Up-Bearer-Type
Cache-Control max-age=70
Expires Wed, 10 Mar 2010 02:42:50 GMT
Last-Modified Wed, 10 Mar 2010 02:41:39 GMT
Content-Type text/html
Age 9
X-Cache HIT from 17376722.22226606.29245568.sohu.com
Via 1.0 17376722.22226606.29245568.sohu.com:80 (squid)
Connection close
4、其它
二、SQUID簡介
SQUID簡單說來是基于UNIX下開發的為WEB應用加速的一個開源軟件。SQUID已經普遍在基于nix系統下的WEB應用中使用,例如:新浪、網易都使用該軟件,其中SQUID FORWINDOWS是在WINDOWS下使用。SQUID通過哈希算法在磁盤上建立目錄,將第一次請求的信息,存在指定的目錄下,供其下次存取,此外SQUID也會將請求的頁面信息緩存在內存中,當客戶端訪問某一頁面時,如果內存中存在,則直接命中CACHE;如果內存中不存在,則到CACHE目錄下獲取,否則到后端的WEB SERVER獲取。
SQUID 特點:
1、SQUID沿繼了nix下配置的風格,可能用慣了WINDOWS的用戶初次使用會有些不適。
2、SQUID包括了一系列的配置策略,認證、訪問控制、緩存設置、URL抓取、日志管理、磁盤管理、群集等。
3、SQUID可以通過refresh_pattern策略設置請求的URL可緩存的內容,失效時間(詳見文檔)。
4、緩存策略說明
SQUID使用了LM算法,LM就是頁面Header里時間(Date)和Last-Modified時間的差。Date一般是Squid從后面取頁面的時間,Last-Modified 一般是頁面生成時間。refresh_pattern 的語法是:refresh_pattern [-i]regexp min percent max [options],min,max的單位是分鐘,percent就是百分比。refresh_pattern 的算法如下:(當前時間定義為CURRENT_DATE)
1) If ((CURRENT_DATE-DATE(就是LM里定義的時間)) < min),cache是新鮮的
2) else if ((CURRENT_DATE-DATE) < (min + (max-min)*percent),cache是新鮮的
3) else cache是過期的,cache過期就需要從后面server取新鮮內容。
常用的幾個參數的意思
override-expire
該選項導致squid在檢查Expires頭部之前,先檢查min值。這樣,一個非零的min時間讓squid返回一個未確認的cache命中,即使該響應準備過期。
override-lastmod
改選項導致squid在檢查LM-factor百分比之前先檢查min值。
reload-into-ims
該選項讓squid在確認請求里,以no-cache指令傳送一個請求。換句話說,squid在轉發請求之前,對該請求增加一個If-Modified-Since頭部。注意這點僅僅在目標有Last-Modified時間戳時才能工作。外面進來的請求保留no-cache指令,以便它到達原始服務器。
一般情況可以使用reload-into-ims。它其實是強行控制對象的超時時間,這違反了http協議的精神,但是在帶寬較窄的場合,可以提高明顯系統相應時間。關于SQUID FORWINDOWS介紹已經很多,本文就不在贅述,詳見SQUID權威手冊這本書。在使用SQUID之前,首先要規劃或確定你現有布署環境,如果你是Single Web Server 建議你在Web Server前增加一臺機器做為SQUID服務器。
三、SQUID FOR WINDOWS配置
本文中SQUID放在172.20.65.201的機器上,應用WEB ServerIP為172.20.65.203,其中SQUID在201上的80端口偵聽,測試客戶端機器為172.20.65.231,在squid.conf中#代表注釋,所以開啟某項設置,需去掉前面的#。TAG標簽代表每一功能項的設置。
1、下載
下載SQUID FOR WINDOWS(文章所用的版本是Squid 2.7.STABLE6,各個版本的配置可能略有不同,大家請注意)。
2、安裝
將SQUID解壓到c:\squid(當然也可解壓在其它盤符下)
3、建立磁盤緩存和日志目錄
默認情況是在安裝磁盤下建立,為確保性能大幅度提升,建立選擇磁盤空間容量較大的盤符,如:建立d:\squid\var目錄,在var目錄下建立logs和cache目錄,其中logs目錄用 于存放日志,cache目錄用于存放硬盤緩存數據。
4、建立緩存目操作權限
為了使抓取的數據,能夠存放在緩存目錄下,建立系統賬戶如squidApp,將其屬于普通用戶組應可,將d:\squid授予該用戶讀寫權限即可。
5、文件更改
c:\squid\etc是SQUID的配置信息的存放處,為確保安全,在你修改配置文件前,請將其備份,然后將squid.conf.default修改為squid.conf,mime.conf.default修改為 mime.conf,cachemgr.conf.default 修改為cachemgr.conf。
6、配置SQUID
針對于SQUID來講大部分配都在squid.conf中,本文中所使用環境如下:
開啟如下訪問控制
acl all src all
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8
acl localnet src 172.16.65.231/255.255.0.0 指定本地網絡及掩碼
開啟訪問端口
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
開啟訪問控制,請一定要注意順序
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow all
http_access allow localnet
http_access deny all
指定SQUID在80端口偵聽, vhost 指定使用加速模式。
http_port 80 vhost
203后臺WEB SERVER, parent指父節點, 80 指后臺網站的端口, 0 ICP 服務端口,no-query originserver 獲取緩存時的選項。
cache_peer 172.20.65.203 parent 80 0 no-query originserver
緩存設置
maximum_object_size_in_memory 1024 KB
cache_dir ufs d:/squid/var/cache 1024 16 256 注意路徑
maximum_object_size 4096 KB
cache_swap_low 90
cache_swap_high 95
日志設置
access_log d:/squid/var/logs/access.log squid 訪問日志
cache_log d:/squid/var/logs/cache.log
cache_store_log d:/squid/var/logs/store.log
emulate_httpd_log on
控制頁面緩存內容
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
refresh_pattern -i \.css$ 20 50% 120 reload-into-ims
refresh_pattern -i \.xml$ 20 50% 120 reload-into-ims
refresh_pattern -i \.html$ 20 90% 120 reload-into-ims
refresh_pattern -i \.jpg$ 20 90% 120 reload-into-ims
refresh_pattern -i \.png$ 20 90% 120 reload-into-ims
refresh_pattern -i \.gif$ 20 90% 120 ignore-reload
refresh_pattern -i \.js$ 20 90% 120 reload-into-ims
refresh_pattern -i \.htm$ 20 90% 120 reload-into-ims
設置郵箱
cache_mgr webmaster_breeze
設置本地主機文件
hosts_file c:/windows/system32/drivers/etc/hosts
7、安裝服務
將squid安裝為服務,命令格式:squid -i [-f configfile] [-n servicename],如c:\squid\sbin\squid -i -n Squid_Proxy
8、初始化緩存目錄
c:\squid\sbin\squid -z
9、啟動Squid_Proxy服務
運行services.msc打開服務窗口,選擇Squid_Proxy服務 ,如果啟動過程出錯90%是配置文件出現問題。
10、squid命令
squid -k reconfigure //啟用新的配置文件
squid -k rotate //截斷日志
squid -k shutdown //stop squid
squid -dx //當服務不能啟動時,進行調試
四、SQUID測試
找一臺機器進行測試,并查看access.log日志,如果出現 TCP_DENY的信息,多為配置不正確。如出現如下信息TCP_MEM_HIT/200 表示,SQUID已經起作用,該請求是從 SQUID運行機器的內存中響應的。
五、性能
用LR跑了一下,1000個并發,內存命中率在100%。