文章目錄
- 在輸出緩衝中儲存壓縮的檔案
- 如果用戶端不接受壓縮後的記憶體
壓縮協商
伺服器怎麼知道瀏覽器能夠接收壓縮內容?瀏覽器怎麼知道接收的內容是壓縮過的?
當支援壓縮的瀏覽器向伺服器發送請求時,會包含一個Accept-Encoding要求標頭,告訴伺服器它支援的壓縮演算法。例如:
Accept-Encoding: gzip,deflate
如果伺服器響應使用了壓縮,會在未壓縮的檔案頭中包含一個回應標頭Content-Encoding,說明檔案是怎麼壓縮的:
Content-Encoding: gzip
然而,不僅僅瀏覽器和伺服器發送和接收請求和響應,代理也會。並且,代理也可以緩衝響應,然後從它的緩衝中響應後來的請求。當代理緩衝了一個壓縮後的檔案,我們怎麼確定代理不會發送這個壓縮後的檔案給不能處理壓縮檔的瀏覽器。
IIS6和II7採取的方法是告訴代理只有當請求與原請求有相同的Accept-Encoding要求標頭時,才從緩衝中響應請求。當啟用壓縮時,IIS6和IIS7在響應中包含Vary頭:
Vary: Accept-Encoding
IIS6也允許通過中繼資料中的屬性重載壓縮檔Cache-Control和Expires頭。這允許禁用壓縮檔的代理緩衝。IIS中繼資料在在IIS6中配置壓縮節的更新中繼資料子節,重載Cache-Control和Expires頭的中繼資料屬性可以在以下位置找到:
- HcCacheControlHeader http://msdn.microsoft.com/en-us/library/ms525179(VS.90).aspx
在IIS7中配置壓縮安裝動態內容壓縮模組
如果需要對動態檔案使用壓縮,首先安裝動態內容壓縮模組。Vista/Windows 7或Windows Server 2008的安裝步驟有些不同:
- 點擊Start | Administrative Tools | Server Manager。
- 展開Roles,點擊Web Server(IIS)。
- 滾動到Role Services,點擊Add Role Services,開啟Add Role Services嚮導。
- 在Select Role Services頁面,滾動到Performance,選擇Dynamic Content Compression,選擇下一步。
在Vista或Windows 7上:
- 點擊Start | Control Panel | Programs | Turn Windows features on or off。Windows Features對話方塊會開啟。
- 展開Internet Information Service,展開World Wide Web Services,再展開Performance Features。選擇Http Compression Dynamic。
啟用壓縮
- 開啟Internet Information Services (IIS) Manager。
- 選擇機器,雙擊右側的Compression表徵圖。
- 壓縮視窗開啟。視窗顯示以下項目:
- Enable dynamic content compression: 除非伺服器已經使用了很多CPU,啟動動態內容壓縮。
- Enable static content compression: 壓縮的靜態內容會被壓縮。所以只在初始壓縮時,會佔用CPU周期。
- Only compress files larger than (in bytes): 壓縮小檔案可以會使得它更大。
- Cache directory: 靜態檔案的儲存位置。可以更換位置。確保磁碟機是本地磁碟機或NTFS分區,並且沒有被壓縮或共用。
- Per application pool disk space limit (in MB): 如果有很多應用程式集區,並且磁碟空間有限,可以調整。如果有100個應用程式集區,這個選項值為100MB,緩衝靜態檔案會使用100 * 100 MB = 10GB。
針對網站、檔案夾或檔案設定壓縮
- 開啟IIS管理器,在左側點擊需要修改壓縮狀態的網站、檔案夾或檔案。
- 切換中間的空格到Features View,雙擊Compression表徵圖。
- 開啟的視窗中可以啟動或禁用動態或靜態檔案的壓縮。
壓縮等級
壓縮等級超高,壓縮比率越大,CPU佔用越大。
靜態檔案和動態檔案的壓縮等級可以分別設定。對於靜態檔案,使用9,最高等級。對於動態檔案,壓縮等級4更好一點,可以參考:
IIS 7 Compression. Good? Bad? How much? http://weblogs.asp.net/owscott/archive/2009/02/22/iis-7-compression-good-bad-how-much.aspx.
但是不同的網站最優壓縮等級是不一樣的,這取決於閒置CPU能力、分頁檔壓縮率、頻寬成本。進行實驗選擇最優的壓縮等級。
設定壓縮等級:
- 從命令列執行:
C:\Windows\System32\Inetsrv\Appcmd.exe set config -section:httpCompression -[name='gzip'].staticCompressionLevel:9 -[name='gzip'].dynamicCompressionLevel:4
- 重啟IIS伺服器。
根據CPU利用率禁用壓縮
為了確保壓縮沒有使CPU超載,IIS7每30秒計算平均CPU利用率。當CPU利用率超過一個限制時,它會自動關閉壓縮。當CPU利用率低於限制時, 它會重新啟用壓縮。
限制的預設值是:
|
關閉壓縮 |
重啟壓縮 |
動態檔案 |
90% |
50% |
靜態檔案 |
100% |
50% |
注意這意味著如果伺服器上的CPU一直在50%以上,但偶然高於90%,動態檔案壓縮會被關閉,但再也不會重新開啟了。
可以通過修改applicationHost.config檔案修改這些限制,通常它在C:\Windows\System32\inetsrv\config檔案夾下。
- 找到<httpCompression>節。
- 修改httpdynamicCompressionEnableCpuUsage屬性:
<httpCompression dynamicCompressionEnableCpuUsage="70" .... >
- 重啟IIS。
如果需要修改其它限制,修改屬性:
|
關閉壓縮 |
重啟壓縮 |
動態檔案 |
dynamicCompressionDisableCpuUsage |
dynamicCompressionEnableCpuUsage |
靜態檔案 |
staticCompressionDisableCpuUsage |
staticCompressionEnableCpuUsage |
如果希望禁止IIS根據CPU利用率關閉壓縮,設定這些屬性值為100。
與httpCompression一起使用的元素和屬性:
- HTTP Compression <httpCompression>
http://www.iis.net/ConfigReference/system.webServer/httpCompression.
設定靜態檔案訪問頻率閾值
只有當靜態檔案被頻繁請求時,IIS7才會壓縮靜態檔案並將它放到緩衝中。如果請求頻率不高,IIS7不會壓縮靜態檔案,這樣可以節省CPU和緩衝空間。
預設情況下,一個檔案只有每10秒被請示2次或更多次時,才會被認為是頻繁請求。這是在web.config的serverRuntime元素的兩個屬性決定的:
serverRuntime屬性 |
描述 |
frequentHitThreshold |
Number of times a URL must be requested within the time span specified in the frequentHitTimePeriod attribute to be considered frequently hit. Must be between 1 and 2147483647. Default is 2. |
frequentHitTimePeriod |
Time interval in which a URL must be requested the number of times specified in the frequentHitThreshold attribute before it is considered to be frequently hit. Default is 10 seconds. |
例如,指定靜態檔案每隔15秒被請求7次,需要緩衝,使用:
<configuration>... <system.webServer> <serverRuntime frequentHitThreshold="7" frequentHitTimePeriod="00:00:15" /> </system.webServer>...</configuration>
緩衝壓縮的動態檔案
IIS7隻緩衝靜態檔案的壓縮版本,而動態檔案在每次請求時進行壓縮。這意味著壓縮動態檔案比靜態檔案佔用更多的CPU。
如果動態檔案對每個訪問者都不同時,這是有意義的。但是,如果動態網頁面對所有訪問者都一樣的,緩衝它們的壓縮版本也是有意義的。
在這種情況下可以使用ASP.NET OutputCache指令。這個方法的問題是,IIS預設在輸出緩衝中隱藏檔的未壓縮版本。對於每個請求,IIS必須在發送到瀏覽器前壓縮緩衝的內容。這樣的效率很低。
在輸出緩衝中儲存壓縮的檔案
IIS快取檔案的壓縮版本,而不是未壓縮版本。這樣就不用在每次請求時都壓縮檔,減少了CPU的使用。
因為使用了ASP.NET的輸出緩衝,需要在頁面中加入OutputCache指令:
<%@ OutputCache Duration="300" VaryByParam="none" %>
然後,修改applicationHost.config檔案,它通常在C:\Windows\System32\inetsrv\config檔案夾中:
- 找到<urlCompression>節。
- 在urlCompression元素中加入 dynamicCompressionBeforeCache="true"屬性。
- 重啟IIS。
如果用戶端不接受壓縮後的記憶體
我們緩衝了壓縮後的內容,如果有一個訪問者使用不支援壓縮內容的瀏覽器訪問了網站會發生什嗎?
當IIS收到請求不壓縮內容的請求,會丟棄緩衝中的壓縮內容,重建內容,並緩衝未壓縮的內容。它會一直使用未壓縮的內容,直到緩衝到期,即使用戶端能夠接受壓縮內容。
可以通過同時緩衝壓縮和未壓縮版本解決這個問題。在OutputCache指令中加入VaryByContentEncoding:
<%@ OutputCache Duration="300" VaryByParam="none" VaryByContentEncoding="gzip;deflate" %>
在OutputCache指令中使用VaryByContentEncoding的一個缺點是這會禁用這個檔案的核心緩衝。
在IIS6中配置壓縮
略
提高頁面的可壓縮性
如果伺服器使用了壓縮,最佳化文字檔的可壓縮性是很有意義的。壓縮演算法對重複內容的效果最好:
- 始終以同一順序指定HTML 屬性。其中一個方法是使用進階web控制項和自訂伺服器控制項產生HTML,不要使用低級HTML伺服器控制項。這會稍微提高CPU使用率,但會保證一致性,例如,使用
<asp:Hyperlink runat="server"......>
代替
<a runat="server" .... >
- 類似地,在CSS選取器中,以字母順序書寫屬性。
- 使用一致的大小寫。對HMTL標籤和屬性使用小寫。
- 使用一致的括弧:不要混用”….”和’….’。
更多資源
- 10 Tips for Writing High-Performance Web Applications
http://msdn.microsoft.com/en-us/magazine/cc163854.aspx
- Confguring HTTP Compression in IIS 7
http://technet.microsoft.com/en-us/library/cc771003(WS.10).aspx
- IIS 6.0 Technical Reference
http://technet.microsoft.com/en-us/library/cc775635(WS.10).aspx
- IIS Compression in IIS6.0
http://weblogs.asp.net/owscott/archive/2004/01/12/57916.aspx
- Everything you ever wanted to know about compression, but were afraid to ask
http://geekswithblogs.net/JamesFleming/archive/2010/02/04/everything-you-ever-wanted-to-know-about-compression-but-were.aspx
- Measuring the Performance Effects of Dynamic Compression in IIS 7.0
http://www.webperformanceinc.com/library/reports/iis7_compression/
- Let's make the web faster
http://code.google.com/speed/articles/use-compression.html
- Page Speed tool
http://code.google.com/speed/page-speed/download.html