Web 內容可以分成兩個類別:靜態內容和動態內容。 靜態內容不會從要求變更為要求。 傳回至網頁瀏覽器的內容一律相同。 靜態內容的範例包括 HTML 檔案、JPG 或 GIF 檔案。
另一個是動態內容。 這是針對每個要求之動態內容變更所產生的回應。 範例包括 ASP.NET 或 PHP 內容。
這兩個類別之間有很大的範圍,其中包括半動態內容。 想像一下執行資料庫查詢的動態 ASP.NET 頁面。 如果基礎資料庫數據表不常變更,則不會在每個要求上執行此查詢。
IIS 輸出快取功能是以半動態內容為目標。 它可讓您快取動態要求的靜態回應,並取得巨大的延展性。
必要條件
在本逐步解說中,您需要 Windows Vista SP1 或 Windows® Server® 2008 Beta 3 或更新版本的 IIS 7.0 或更新版本。 本逐步解說也會使用 ASP.NET 2.0,此元件必須安裝為 IIS 安裝程式中的選擇性元件。
逐步解說概觀
在下列逐步解說中,我們使用 IIS 擴充性介面,將語言特定的著作權訊息新增至 JPG 檔案。
首先,我們會藉由新增 Managed 處理程式來執行這項操作。 不過,以動態方式將著作權訊息插入每個 JPG 檔案時,會產生成本,因為現在必須針對每個 JPG 檔案執行 Managed 程式代碼。
接下來,我們會安裝 IIS 效能分析工具 WCAT,以測量 JPG 著作權處理程式的輸送量。
然後,我們會新增輸出快取,以重新取得新增著作權處理程式所產生的效能降低。
第一部分 – 撰寫和設定著作權處理程式
在目錄下建立名為 'pictures' 的
%systemroot%\inetpub\wwwroot目錄。 在提升權限的指令殼層中執行下列命令:md %systemdrive%\inetpub\wwwroot\pictures將一些數字圖片 - 本逐步解說假設為 JPG 檔案 - 複製到新的圖片目錄。
注意
由於 Windows Server 2008 上的 Internet Explorer 安全性設定很高,您可能會收到安全性對話方塊,告知您網站遭到封鎖。 若要下載 IIS 桌布,請將 wallpaper.iis7.org 新增至信任的網站清單。
使用 appcmd 命令行工具建立應用程式。
%windir%\system32\inetsrv\appcmd add app -site.name:"Default Web Site" -path:/pictures -physicalPath:%systemdrive%\inetpub\wwwroot\pictures在圖片目錄底下建立目錄App_Code:
md %systemdrive%\inetpub\wwwroot\pictures\App_Code開啟 記事本,並將下列程式代碼貼入其中。
using System; using System.Web; using System.Drawing; using System.Drawing.Imaging; namespace IIS7Demos { public class imageCopyrightHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { string message = "Copyright © IIS 7.0 Team"; try { string languageHeader; languageHeader = context.Request.Headers["Accept-Language"].Substring(0,2).ToUpper(); switch (languageHeader) { case ("DE"): message = "IIS 7.0 Team - Alle Rechte vorbehalten"; break; case ("ES"): message = "Marca Registrada IIS 7.0 Team"; break; default: break; } } catch { // if something fails, e.g. no Language-Accept header, we go with the english message } InsertCopyrightMessage ( context, message, "yellow" ); } void InsertCopyrightMessage( HttpContext context, string message, string color ) { try { // get physical path of request string strPath = context.Request.PhysicalPath; // load as bitmap Bitmap jpgFile = new Bitmap(strPath); // add copyright message Graphics g = Graphics.FromImage(jpgFile); Font f = new Font("Arial", 20, GraphicsUnit.Pixel); SolidBrush sb = new SolidBrush(Color.FromName(color)); // write copyright message to bitmap g.DrawString( message, f, sb, 5, jpgFile.Height - f.Height - 5 ); f.Dispose(); g.Dispose(); // save it to response stream jpgFile.Save( context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg ); jpgFile.Dispose(); } catch (Exception e) { context.Response.Write(e.Message); } } public bool IsReusable { get { return true; } } } }將檔案儲存為
%systemdrive%\inetpub\wwwroot\pictures\App\_Code\imageCopyrightHandler.cs。建立處理程式,以在要求 JPG 檔案時執行此程式代碼:
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/handlers /+[name='imageCopyrightHandler-Integrated',path='*.jpg', verb='GET,HEAD',type='IIS7Demos.imageCopyrightHandler',preCondition='integratedMode']我們也必須啟用目錄瀏覽,因為還沒有預設檔:
%windir%\system32\inetsrv\appcmd set config "Default Web Site/pictures" -section:directoryBrowse -enabled:true在 Internet Explorer 網址列中輸入 ,瀏覽至圖片應用程式:
http://localhost/pictures。 單擊 IIS 目錄中 JPG 檔案的連結。 您應該會看到 JPG 影像與插入的 Copyright 訊息。查看程序代碼。 您會看到著作權訊息相依於瀏覽器傳送的「接受語言」標頭。 如果您已安裝德國版本的 Microsoft Server 2008,您會看到著作權訊息“IIS 7.0 Team - Alle Rechte vorbehalten”;如果您有西班牙文版本,您會看到「Marca Registrada IIS 7.0 Team」。 在所有其他情況下,著作權訊息會是「著作權 © IIS 7.0 小組」。 測試此程式代碼的一種方式是變更 Internet Explorer 傳送的 “Accept-Language” 標頭:
- 開啟 「Internet Explorer」。
- 開啟 [工具] 功能表,然後按兩下 [因特網選項]。
- 按兩下 [語言] 按鈕。
- 按兩下 [新增...]button and add “es” for Spanish or “de” for German.
- 透過 [上移] 按鈕,將新語言移至列表頂端。
- 瀏覽至
http://localhost/pictures/<your_jpg_file>.jpg。 著作權訊息已變更為您設定的語言。 - 別忘了回到 [語言] 對話框並重設-否則,您可能會想知道您稍後為何會取得西班牙文或德文網頁。
第二部分 - imageCopyrightHandler 的效能測試
JPG 著作權處理程式一旦運作,我們必須判斷程式代碼的速度。 安裝 IIS 6.0 資源套件工具以執行效能測試:
下載 IIS 6.0 資源套件工具並加以安裝。 只執行自訂安裝並安裝 Web 容量分析工具 (WCAT)。 WCAT 是唯一需要執行效能測試的 IIS 6.0 資源套件工具功能。
注意
由於 Windows Server 2008 上的 Internet Explorer 安全性設定很高,您可能會收到安全性對話方塊,告知您網站遭到封鎖。 若要下載 IIS 6.0 資源套件,請將 *.microsoft.com 新增至信任的網站清單。
建立名為 PERFTEST 的目錄,例如:
md %systemdrive%\perftestWCAT 控制器需要三個輸入檔:
- 腳本檔案,告知 WCAT 要要求哪些 URL。 每個 URL 都會取得唯一的 ClassID
- 散發檔案,告知 WCAT 應該如何將要求分散到腳本檔案中指定的 URL
- 組態檔,可設定特定效能執行的參數,例如測試的持續時間、要仿真的 HTTP 用戶端數目等等。
腳本檔案
在 perftest 目錄中建立名為 script.cfg 的新檔案,並將下列內容貼入其中:
NEW TRANSACTION classId = 1 NEW REQUEST HTTP Verb = "GET" URL = "http://localhost/pictures/<your image name>.JPG" NEW TRANSACTION classId = 2 NEW REQUEST HTTP Verb = "GET" URL = "http://localhost/pictures/<your image name>.JPG"注意
將 <映像名稱> 專案取代為 JPG 檔案的名稱。 如果您有更多 JPG 檔案,您可以新增交易。 請確定您為每個交易提供新的 ClassID。
散發檔案
散發檔案會告知 WCAT 應該如何權衡要求。 使用上述兩個 URL,我們執行偶數 50/50 散發。 每個 ClassID 都會要求 50% 的時間。
在 perftest 目錄中建立名為
%systemdrive%\perftest\distribution.cfg的檔案,並將下列內容貼入其中:1 50 2 50組態檔
以下是測試的建議參數:
- 持續時間:30 秒
- 熱身:5 秒
- 冷卻時間:5 秒
- 模擬 Http 用戶端:20
在 perftest 目錄中建立名為 config.cfg 的檔案,並將下列內容貼入其中:
Warmuptime 5s Duration 30s CooldownTime 5s NumClientMachines 1 NumClientThreads 20執行下列命令來啟動控制器:
Cd \perftest "%programfiles%\IIS Resources\WCAT Controller\wcctl" -c config.cfg -s script.cfg -d distribution.cfg -a localhost一旦所有用戶端都連線,效能測試就會啟動。
因為我們只有一個用戶端,請開啟另一個提升許可權的命令殼層,然後執行下列命令:
"%programfiles%\IIS Resources\WCAT Client\wcclient.exe" localhost若要使用更多用戶端執行此動作,請將 config.cfg 中的 NumClientMachines 設定為較高的數位,並藉由指定控制器計算機的名稱,透過 wcclient 命令將用戶端連線到控制器。
範例:wcclient MyPerfTestControllerMachine
注意
如果您在64位版本的Windows上執行此動作,WCAT 會安裝在「程式檔(x86)」目錄中,而且您必須使用
%programfiles(x86)%來啟動WCAT。以下是第一次執行的結果:
######################################################################## WCAT Performance Statistics_________________________________ Server : localhost () #Transactions : 3 (HTTP/1.1) Total Async Sockets : 20 (5 WCAT Pool Threads) Total Elapsed Time : 30 Secs (0 Hrs,0 Mins,30 Secs) Current Connections : 20 Total Connection Attempts : 436 ( 14/Sec) Total Connect Errors : 0 ( 0/Sec) Total Success Connections : 436 ( 14/Sec) Total Consec. Connect Errors: 0 ( 0/Sec) Total Bytes : 32301100 ( 1051 KB/Sec) Total Bytes Written : 32264 ( 1 KB/Sec) Total Bytes Read : 32268836 ( 1050 KB/Sec) Total Requests : 436 ( 14/Sec) Total Responses : 436 ( 14/Sec) Total Socket Reads : 6976 ( 232/Sec) Total Socket Writes : 436 ( 14/Sec) Total Parse Errors : 0 ( 0/Sec) Total Socket Errors : 0 ( 0/Sec) Total I/O Errors : 0 ( 0/Sec) Total Internal Errors : 0 ( 0/Sec) Total Time Outs : 0 ( 0/Sec) Total 200 OK : 436 ( 14/Sec) Total 30X Redirect : 0 ( 0/Sec) Total 304 Not Modified : 0 ( 0/Sec) Total 404 Not Found : 0 ( 0/Sec) Total 500 Server Error : 0 ( 0/Sec) Total Bad Status : 0 ( 0/Sec) Min. Connect Time : 0 MS Avg. Connect Time : 0 MS Max. Connect Time : 16 MS Min. Resp Time (1st Byte) : 1281 MS Avg. Resp Time (1st Byte) : 1371 MS Max. Resp Time (1st Byte) : 1578 MS Min. Response Time (Last) : 1281 MS Avg. Response Time (Last) : 1373 MS Max. Response Time (Last) : 1578 MS Current Outstanding Connects: 0 ( 20 Max) Current Waitable Connects : 0 ( 20 Max) Total Asynchronous Connects : 531 ( 1/Sec) Total Discarded Connects : 0 ( 0/Sec) ########################################################################要查看的重要數位是每秒的要求數。 在此情況下,我們會每秒收到 14 個要求。
謹慎的話 - JPG 檔案越大,您會看到的要求越少。 您的電腦可能是網路系結:IIS 將無法處理更多要求,因為網路已與您傳送的數據飽和。 您會在 200-300 KB 範圍內看到 JPG 檔案的最佳結果。
新增輸出快取
動態插入著作權訊息的程式代碼相當慢。 網頁伺服器的每秒 14 個要求並不快。 IIS 執行得更好。 您只需要建立快取原則,將具有 JPG 擴充功能的 URL 放入核心模式快取。 以下是您新增快取原則的方式:
透過 IIS 管理工具新增快取原則
- 流覽至 [管理員 工具],然後選取 [網際網路資訊服務 (IIS) 管理員]。
- 使用左側的樹視圖流覽至「圖片」應用程式。
- 選取 [輸出快取規則] 選單項。
- 按兩下 [新增...]在 [動作] 功能表中。
- 將 JPG 新增為「擴展名」以快取。
- 在 [監視快取的檔案] 區段中選取 [時間間隔],然後輸入 00:00:10 作為時間間隔。
- 核取 [標頭] 複選框,然後輸入 “Accept-Language”。
注意
輸出快取使用者介面不適用於 Windows Vista Service Pack 1 之前的版本。
透過命令行新增快取原則
若要使用 appcmd 工具執行相同的程式,請輸入下列命令:
%windir%\system32\inetsrv\appcmd set config "Default Web Site/pictures"
-section:caching /+profiles.[extension='.jpg',duration='00:00:10',
policy='CacheForTimePeriod',varyByHeaders='Accept-Language']
重複執行效能,以查看組態設定變更的內容和方式。
執行下列命令來啟動控制器:
Cd \perftest "%programfiles%\IIS Resources\WCAT Controller\wcctl" -c config.cfg -s script.cfg -d distribution.cfg -a localhost使用下列項目啟動用戶端:
"%programfiles%\IIS Resources\WCAT Client\wcclient.exe" localhost注意
如果您在 64 位版本的 Windows 上執行此動作,WCAT 會安裝在
program files (x86)目錄中,而且您必須使用%programfiles(x86)%來啟動 WCAT。
範例輸出
########################################################################
WCAT Performance Statistics_________________________________
Server : localhost ()
#Transactions : 3 (HTTP/1.1)
Total Async Sockets : 20 (5 WCAT Pool Threads)
Total Elapsed Time : 30 Secs (0 Hrs,0 Mins,30 Secs)
Current Connections : 19
Total Connection Attempts : 13020 ( 434/Sec)
Total Connect Errors : 0 ( 0/Sec)
Total Success Connections : 13019 ( 433/Sec)
Total Consec. Connect Errors: 0 ( 0/Sec)
Total Bytes : 958045737 (31186 KB/Sec)
Total Bytes Written : 963406 ( 31 KB/Sec)
Total Bytes Read : 957082331 (31155 KB/Sec)
Total Requests : 13019 ( 433/Sec)
Total Responses : 13019 ( 433/Sec)
Total Socket Reads : 258283 ( 8609/Sec)
Total Socket Writes : 13019 ( 433/Sec)
Total Parse Errors : 0 ( 0/Sec)
Total Socket Errors : 0 ( 0/Sec)
Total I/O Errors : 0 ( 0/Sec)
Total Internal Errors : 0 ( 0/Sec)
Total Time Outs : 0 ( 0/Sec)
Total 200 OK : 13019 ( 433/Sec)
Total 30X Redirect : 0 ( 0/Sec)
Total 304 Not Modified : 0 ( 0/Sec)
Total 404 Not Found : 0 ( 0/Sec)
Total 500 Server Error : 0 ( 0/Sec)
Total Bad Status : 0 ( 0/Sec)
Min. Connect Time : 0 MS
Avg. Connect Time : 0 MS
Max. Connect Time : 63 MS
Min. Resp Time (1st Byte) : 0 MS
Avg. Resp Time (1st Byte) : 33 MS
Max. Resp Time (1st Byte) : 125 MS
Min. Response Time (Last) : 0 MS
Avg. Response Time (Last) : 45 MS
Max. Response Time (Last) : 141 MS
Current Outstanding Connects: 0 ( 20 Max)
Current Waitable Connects : 0 ( 20 Max)
Total Asynchronous Connects : 14093 ( 147/Sec)
Total Discarded Connects : 0 ( 0/Sec)
########################################################################
輸出快取進階主題
效能計數器
若要確定輸出快取中的效能,請查看「可靠性和 效能監視器」中的輸出快取計數器。 有許多有趣的計數器。 以下是如何使用「可靠性與 效能監視器」與輸出快取的一個範例。
- 在 Windows Server 2008 上,透過 [開始] 功能表 啟動 PERFMON。 移至 [管理員 工具],然後按兩下 [可靠性與 效能監視器]。 在 Vista 上,您會在 控制台 中找到「管理員 工具」。
- 在右側的樹視圖中選取 [效能監視器],然後按兩下工具列中的大 “+” 登入。
- 流覽至 [Web 服務快取] 計數器,然後按下它以開啟。
- 新增「已快取的 URI 總計」計數器。
- 重新執行 WCAT 測試。
您會看到快取 URI 數目會根據您在效能測試期間要求的項目數目而增加。
IIS 核心模式快取規則
IIS 輸出快取支援兩個快取原則。 一般輸出快取原則會利用位於 IIS 背景工作進程的快取。 另一個快取原則是核心模式快取原則,在此情況下,快取位於核心模式驅動程式HTTP.SYS。
在內核模式中快取內容可讓網站更快速地進行。 修改圖片應用程式的組態,以使用內核模式快取。 以下是目前組態的外觀(%systemdrive%\inetpub\wwwroot\pictures\web.config):
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<directoryBrowse enabled="true" />
<caching>
<profiles>
<add extension=".jpg" policy="CacheForTimePeriod"
duration="00:00:10" varyByHeaders="Accept-Language" />
</profiles>
</caching>
</system.webServer>
</configuration>
現在將其變更為使用內核模式快取:
開啟 [
%systemdrive%\inetpub\wwwroot\pictures\web.config]。變更設定。
<caching> <profiles> <add extension=".jpg" policy="CacheForTimePeriod" duration="00:00:10" varyByHeaders="Accept-Language" /> </profiles> </caching>為下列內容:
<caching> <profiles> <add extension=".jpg" kernelCachePolicy="CacheForTimePeriod" duration="00:00:10" /> </profiles> </caching>
您會看到我們不再使用 varyByHeaders 屬性。 這是因為 kernelModeCache 不支援使用者模式輸出快取支援的一些功能。
核心模式輸出快取的限制
使用者模式和核心模式輸出快取之間有兩個顯著差異。
- 核心模式輸出快取不支援必須在使用者模式中執行的模組和功能,例如驗證或授權。 範例:如果已啟用基本或 Windows 驗證 等驗證配置,快取原則將無法運作。 內容會提供,但不會快取。 如需如何找出內容是否已快取,請參閱。 如需有關如何在內核模式 中快取回應的詳細資訊,請參閱此知識庫文章。
- 核心模式輸出快取支援 varyByHeaders 屬性,但不支援 varyByQuerystring。
針對快取進行疑難解答
失敗的要求事件緩衝處理 (FREB) 是找出要求是否已快取的最佳方式。 FREB 會告訴您為什麼不會快取某些專案。 以下是 FREB 記錄的範例。 在此情況下,HTTPSYS_CACHEABLE事件會告訴您要求不會快取,因為未啟用內核模式快取。
如需如何使用 FREB 的詳細資訊,請參閱 在 IIS 7 中使用追蹤對失敗的要求進行疑難解答。
使用下列命令來找出核心模式中快取的內容:
netsh http show cachestate
快取複雜
即使您啟用輸出快取,IIS 也不會立即快取要求。 在 IIS 將要求視為「值得快取」之前,必須先要求幾次。 快取價值可透過此 MSDN 文章中所述的 ServerRuntime 一節來設定。
判斷快取價值的兩個屬性為 frequentHitTimePeriod 和 frequentHitThreshold。 只有在要求超過<frequentHitThreshold>可快取 URL 的要求抵達頻繁的HitTimePeriod> 時<,才會快取要求。
frequentHitTimePeriod 的預設設定為 10 秒。
frequentHitThreshold 的預設設定為 2。
快取您最受歡迎的頁面
在上述範例中,我們會將所有擴展名為 JPG 的檔案放入輸出快取中。 這不一定能夠運作,因為有時候您想要更具選擇性,而且只將特定檔放入輸出快取中。 以下是使用您最常要求的頁面,您的預設檔案來執行此作業的方式:
在目錄中建立名為 default.aspx 的
%systemdrive%\inetpub\wwwroot\pictures檔案,並新增下列程序代碼:<%=DateTime.Now%>流覽至 [管理員 工具],然後選取 [網際網路資訊服務 (IIS) 管理員]。
使用左側的樹視圖流覽至「圖片」應用程式。
按兩下頁面底部的 [內容檢視]。
選取預設檔,例如default.aspx頁面。
單擊右側 [動作] 功能表中的 [切換至功能檢視]。 您設定的每個設定現在只會套用至預設檔。
開啟 [輸出快取規則] 設定。
將 「.aspx」 新增為擴展名。
選取 [內核模式快取],然後我們可以選取 [時間間隔] 並啟用 [監視快取的檔案],然後輸入 00:00:30 作為時間間隔。
使用 “Internet Explorer” 瀏覽至
http://localhost/pictures。 藉由不斷重新整理頁面 (按 Ctrl+F5 以確保它不是來自瀏覽器快取),您會看到時間不會變更 30 秒。
摘要
針對半動態內容使用 IIS 輸出快取功能可以改善您的網站。 您會看到效能和輸送量容量大幅改善。 簡單的組態變更足以利用這項功能。