• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 基于反相代理的Web緩存加速(下)

    發表于:2007-07-04來源:作者:點擊數: 標簽:
    基于反相代理的Web緩存加速(下) 可緩存的動態頁面設計 什么樣的頁面能夠比較好的被緩存服務器緩存呢?如果返回內容的HTTP HEADER中有Last-Modified和Expires相關聲明,比如: Last-Modified: Wed, 14 May 2003 13:06:17 GMTExpires: Fri, 16 Jun 2003 13:06:

    基于反相代理的Web緩存加速(下)

    可緩存的動態頁面設計

    什么樣的頁面能夠比較好的被緩存服務器緩存呢?如果返回內容的HTTP HEADER中有"Last-Modified"和"Expires"相關聲明,比如:

    Last-Modified: Wed, 14 May 2003 13:06:17 GMTExpires: Fri, 16 Jun 2003 13:06:17 GMT


    前端緩存服務器在期間會將生成的頁面緩存在本地:硬盤或者內存中,直至上述頁面過期。

    因此,一個可緩存的頁面:

  • 頁面必須包含Last-Modified:標記

    一般純靜態頁面本身都會有Last-Modified信息,動態頁面需要通過函數強制加上,比如在PHP中:

    // always modified nowheader("Last-Modified: " . gmdate("D, d M Y H:i:s"). " GMT");


  • 必須有Expires或Cache-Control: max-age標記設置頁面的過期時間:

    對于靜態頁面,通過apache的mod_expires根據頁面的MIME類型設置緩存周期:比如圖片缺省是1個月,HTML頁面缺省是2天等。

    <IfModule mod_expires.c>     ExpiresActive on    ExpiresByType image/gif "access plus 1 month"    ExpiresByType text/css "now plus 2 day"    ExpiresDefault "now plus 1 day"</IfModule>


    對于動態頁面,則可以直接通過寫入HTTP返回的頭信息,比如對于新聞首頁index.php可以是20分鐘,而對于具體的一條新聞頁面可能是1天后過期。比如在php中加入了1個月后過期:

    // Expires one month later<br>header("Expires: " .gmdate ("D, d M Y H:i:s", time()+ 3600 * 24 * 30). " GMT");


  • 如果服務器端有基于HTTP的認證,必須有Cache-Control: public標記,允許前臺ASP應用的緩存改造 首先在公用的包含文件中(比如include.asp)加入以下公用函數:

  • <%' Set Expires Header in minutesFunction SetExpiresHeader(ByVal minutes)     ' set Page Last-Modified Header:    ' Converts date (19991022 11:08:38) to http form (Fri, 22 Oct 1999 12:08:38 GMT)    Response.AddHeader "Last-Modified", DateToHTTPDate(Now())        ' The Page Expires in Minutes    Response.Expires = minutes        ' Set cache control to externel applications    Response.CacheControl = "public"End Function ' Converts date (19991022 11:08:38) to http form (Fri, 22 Oct 1999 12:08:38 GMT)Function DateToHTTPDate(ByVal OleDATE)  Const GMTdiff = #08:00:00#  OleDATE = OleDATE - GMTdiff  DateToHTTPDate = engWeekDayName(OleDATE) & _    ", " & Right("0" & Day(OleDATE),2) & " " & engMonthName(OleDATE) & _    " " & Year(OleDATE) & " " & Right("0" & Hour(OleDATE),2) & _    ":" & Right("0" & Minute(OleDATE),2) & ":" & Right("0" & Second(OleDATE),2) & " GMT"End Function Function engWeekDayName(dt)    Dim Out    Select Case WeekDay(dt,1)        Case 1:Out="Sun"        Case 2:Out="Mon"        Case 3:Out="Tue"        Case 4:Out="Wed"        Case 5:Out="Thu"        Case 6:Out="Fri"        Case 7:Out="Sat"    End Select    engWeekDayName = OutEnd FunctionFunction engMonthName(dt)    Dim Out    Select Case Month(dt)        Case 1:Out="Jan"        Case 2:Out="Feb"        Case 3:Out="Mar"        Case 4:Out="Apr"        Case 5:Out="May"        Case 6:Out="Jun"        Case 7:Out="Jul"        Case 8:Out="Aug"        Case 9:Out="Sep"        Case 10:Out="Oct"        Case 11:Out="Nov"        Case 12:Out="Dec"    End Select    engMonthName = OutEnd Function%>


    然后在具體的頁面中,比如index.asp和news.asp的“最上面”加入以下代碼:HTTP Header

    <!--#include file="../include.asp"--><%


    '頁面將被設置20分鐘后過期

    SetExpiresHeader(20)%>


    應用的緩存兼容性設計

    經過代理以后,由于在客戶端和服務之間增加了中間層,因此服務器無法直接拿到客戶端的IP,服務器端應用也無法直接通過轉發請求的地址返回給客戶端。但是

    在轉發請求的HTTD頭信息中,增加了HTTP_X_FORWARDED_????信息。用以跟蹤原有的客戶端IP地址和原來客戶端請求的服務器地址:

    下面是2個例子,用于說明緩存兼容性應用的設計原則:

    '對于一個需要服務器名的地址的ASP應用:不要直接引用HTTP_HOST/SERVER_NAME,判斷一下是否有HTTP_X_FORWARDED_SERVER

    function getHostName ()          dim hostName as String = ""           hostName = Request.ServerVariables("HTTP_HOST")           if not isDBNull(Request.ServerVariables("HTTP_X_FORWARDED_HOST")) then                    if len(trim(Request.ServerVariables("HTTP_X_FORWARDED_HOST"))) > 0 then                     hostName = Request.ServerVariables("HTTP_X_FORWARDED_HOST")                 end if            end if            return hostNmae    end function


    對于一個需要記錄客戶端IP的PHP應用:不要直接引用REMOTE_ADDR,而是要使用HTTP_X_FORWARDED_FOR,

    function getUserIP (){           $user_ip = $_SERVER["REMOTE_ADDR"];            if ($_SERVER["HTTP_X_FORWARDED_FOR"]) {                   $user_ip = $_SERVER["HTTP_X_FORWARDED_FOR"];           }   }


    注意:HTTP_X_FORWARDED_FOR如果經過了多個中間代理服務器,有何能是逗號分割的多個地址,比如:200.28.7.155,200.10.225.77 unknown,219.101.137.3

    因此在很多舊的數據庫設計中(比如BBS)往往用來記錄客戶端地址的字段被設置成20個字節就顯得過小了。

    經常見到類似以下的錯誤信息:

    Microsoft JET Database Engine錯誤 '80040e57'字段太小而不能接受所要添加的數據的數量。試著插入或粘貼較少的數據。/inc/char.asp,行236


    原因就是在設計客戶端訪問地址時,相關用戶IP字段大小最好要設計到50個字節以上,當然經過3層以上代理的幾率也非常小。

    如何檢查目前站點頁面的可緩存性(Cacheablility)呢?可以參考以下2個站點上的工具:

    http://www.ircache.net/cgi-bin/cacheability.py

    附:SQUID性能測試試驗

    phpMan.php是一個基于php的man page server,每個man

    page需要調用后臺的man命令和很多頁面格式化工具,系統負載比較高,提供了Cache

    Friendly的URL,以下是針對同樣的頁面的性能測試資料:

    測試環境:Redhat 8 on Cyrix 266 / 192M Mem

    測試程序:使用apache的ab(apache benchmark):

    測試條件:請求50次,并發50個連接

    測試項目:直接通過apache 1.3 (80端口) vs squid 2.5(8000端口:加速80端口)

    測試1:無CACHE的80端口動態輸出:

    ab -n 100 -c 10 http://www.chedong.com:81/phpMan.php/man/kill/1This is ApacheBench, Version 1.3d <$Revision: 1.2 $> apache-1.3Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd,http://www.zeustech.net/Copyright (c) 1998-2001 The Apache Group, http://www.apache.org/Benchmarking localhost (be patient).....doneServer Software:       Apache/1.3.23                                     Server Hostname:        localhostServerPort:           80Document Path:         /phpMan.php/man/kill/1Document Length:        4655 bytesConcurrency Level:      5Time taken for tests:   63.164 secondsComplete requests:      50Failed requests:        0Broken pipe errors:     0Total transferred:      245900 bytesHTML transferred:       232750 bytesRequests per second:    0.79 [#/sec] (mean)Time per request:       6316.40 [ms](mean)Time per request:       1263.28 [ms](mean, across all concurrent requests)Transfer rate:         3.89 [Kbytes/sec] receivedConnnection Times (ms)             min  mean[+/-sd] median   maxConnect:        0   29  106.1      0   553Processing:  2942  60161845.4   6227 10796Waiting:    2941  5999 1850.7   6226 10795Total:      2942  6045 1825.9   6227 10796Percentage of the requests served within a certain time (ms)  50%   6227  66%   7069  75%   7190  80%   7474  90%   8195  95%   8898  98%   9721  99%  10796 100%  10796 (last request)


    測試2:SQUID緩存輸出

    /home/apache/bin/ab -n50 -c5"http://localhost:8000/phpMan.php/man/kill/1";This is ApacheBench, Version 1.3d <$Revision: 1.2 $> apache-1.3Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd,http://www.zeustech.net/Copyright (c) 1998-2001 The Apache Group, http://www.apache.org/Benchmarking localhost (be patient).....doneServer Software:       Apache/1.3.23                                     Server Hostname:        localhostServerPort:           8000Document Path:         /phpMan.php/man/kill/1Document Length:        4655 bytesConcurrency Level:      5Time taken for tests:   4.265 secondsComplete requests:      50Failed requests:        0Broken pipe errors:     0Total transferred:      248043 bytesHTML transferred:       232750 bytesRequests per second:    11.72 [#/sec] (mean)Time per request:       426.50 [ms] (mean)Time per request:       85.30 [ms] (mean,across all concurrent requests)Transfer rate:         58.16 [Kbytes/sec] receivedConnnection Times (ms)             min  mean[+/-sd] median   maxConnect:       0     1   9.5      0    68Processing:    7    83  537.4     7  3808Waiting:       5    81  529.1     6  3748Total:         7    84  547.0     7  3876Percentage of the requests served within a certain time (ms)  50%      7  66%      7  75%      7  80%      7  90%      7  95%      7  98%      8  99%   3876 100%   3876 (last request)


    結論:No Cache / Cache = 6045 / 84 = 70

    結論:對于可能被緩存請求的頁面,服務器速度可以有2個數量級的提高,因為SQUID是把緩存頁面放在內存里的(因此幾乎沒有硬盤I/O操作)。

    小節:

  • 大訪問量的網站應盡可能將動態網頁生成靜態頁面作為緩存發布,甚至對于搜索引擎這樣的動態應用來說,緩存機制也是非常非常重要的。

  • 在動態頁面中利用HTTP Header定義緩存更新策略。

  • 利用緩存服務器獲得額外的配置和安全

  • 日志非常重要:SQUID日志缺省不支持COMBINED日志,但對于需要REFERER日志的這個補丁非常重要:http://www.squid-cache.org/mail-archive/squid-dev/200301/0164.html
  • 原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>