針對 IIS 6 或 IIS 7.x 中的 IIS 壓縮問題進行疑難解答
適用於:網際網路資訊服務 6.0、網際網路資訊服務 7.0 和更新版本
概觀
為 IIS 6 或 7 Web 應用程式啟用 HTTP 壓縮是提升網站效能的其中一種方式。
系統管理 GUI 不會公開許多完全管理 IIS 所需的壓縮屬性。 它只是提供開啟或關閉開關。 因此,若要完全啟用 HTTP 壓縮,您必須使用 IIS 管理員以外的工具來更新 metabase.xml 檔案。 最常使用的工具是 adsutil.vbs,包含在 IIS 安裝目錄中。
本文可協助您設定壓縮,並識別 IIS 壓縮可能無法在 IIS 6 和 IIS 7.x 中運作的常見原因。
此疑難解答員中使用的工具
- Fiddler
- Process Monitor
- Metabase ACL
- IIS 7 FREB 追蹤
驗證
判斷壓縮是否正常運作
判斷 IIS 伺服器傳送壓縮回應的唯一方法是分析用戶端要求和伺服器回應的網路追蹤。 來自用戶端的要求必須包含下列 HTTP 要求標頭:
HTTP: Accept-Encoding =gzip, deflate
這可讓伺服器知道客戶端願意接收壓縮的回應,並支援壓縮。 在傳回中,來自伺服器的壓縮回應將包含下列 HTTP 回應標頭和值:
HTTP: Content-Encoding = gzip
下列螢幕快照顯示當壓縮無法運作時,Fiddler 工具的輸出:
針對壓縮問題進行疑難解答
執行下列步驟來針對壓縮問題進行疑難解答:
在 IIS 6 或 IIS 7 中啟用壓縮。
從 IIS 管理員,以滑鼠右鍵按兩下 [網站] 節點,選取 [屬性],然後選取 [ 服務]。
指定壓縮資料夾和許可權。
IIS 會將壓縮的檔案儲存在可以設定的資料夾中。 根據預設,它
%windir%\IIS Temporary Compressed Files
適用於 IIS 6 和%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files
IIS 7。IIS_WPG(IIS 7 IIS_IURS) 必須具有此資料夾的完整控制許可權。 使用 行程監視器 來針對這種類型的許可權問題進行疑難解答。
檢查是否在 Metabase.xml 中啟用壓縮。
壓縮不會在右節點的中繼基底中開啟。 壓縮組態有三個中繼基底節點:
w3svc/filters/compression/parameters
w3svc/filters/compression/gzip
w3svc/filters/compression/deflate
設定
/parameters
節點是必要的。 然後,您可以設定/gzip
或/deflate
節點,或兩者。 這表示只設定 gzip、deflate 或參數節點將無法運作。 如果您設定/parameters
和/gzip
節點,則會啟用 Gzip 壓縮配置。 如果您設定/parameters
和/deflate
節點,將會啟用Deflate壓縮配置。 最後,如果您設定這三個節點,則會啟用 GZip 壓縮和 Deflate 壓縮。檢查 IIS 6 的 Metabase 許可權。
根據預設,
IIS_WPG
具有讀取、不安全的讀取、列舉索引鍵和寫入許可權。/LM/W3SVC/Filters
如果許可權因為非預期的變更或安全性強化而移除,IIS 將無法初始化壓縮。
使用 metaacl.vbs 來驗證和修改 IIS 6 中繼基底 ACL。 如需詳細資訊,請參閱 預設 Metabase ACL。
如果應用程式集區身分識別(或
IIS_WPG
一般群組)沒有中繼基底密鑰 W3SVC 或篩選的讀取和寫入存取權,則 的失敗狀況COMPRESSION_DISABLED
將會記錄在 Windows 企業追蹤中(ETW) 追蹤中。ETW 追蹤
IISCompression: STATIC_COMPRESSION_NOT_SUCCESS - IIS has been unsuccessful doing static compression Reason: COMPRESSION_DISABLED
檢查是否在 Metabase.xml 中關閉動態或靜態壓縮。
在三個組態節點中,
/parameters
/gzip
/deflate
您可以選擇啟用靜態和/或動態壓縮。 若要啟用檔類型的靜態壓縮,例如.txt和.html,您必須將HcDoStaticCompression
索引鍵設定為1
(或TRUE
)。 若要啟用檔類型的動態壓縮,例如.asp、.aspx、.asmx 或 .exe,您必須將HcDoDynamicCompression
索引鍵設定為1
(或TRUE
)。例如,若要在
/parameters
節點上設定動態壓縮,請使用 adsutil.vbs 執行下列命令:cscript.exe adsutil.vbs SET w3svc/filters/compression/parameters/HcDoDynamicCompression TRUE
上一個命令的輸出如下所示:
HcDoDynamicCompression : (BOOLEAN) True
在 IIS7 中
<system.webServer> <urlCompression doStaticCompression="true" doDynamicCompression="true" /> </system.webServer>
檢查您要壓縮的檔案類型是否列在 和
/deflate
節點的適當 [擴展名] 區段中/gzip
。使用 和/或
HcDoStaticCompression
索引鍵開啟壓縮HcDoDynamicCompression
之後,請指定必須實際壓縮哪些文件類型。 根據預設,STATIC 壓縮會使用檔類型,例如.htm、.html .txt,以及動態壓縮會使用.asp、.dll和.exe。 如果您想要壓縮不同的檔類型,例如.aspx,請根據您使用的壓縮類型,將它新增至 and-or/deflate
節點中的/gzip
適當擴展名區段。 針對靜態檔案壓縮(例如 .html、txt 和 xml),請將擴展名新增至HcFileExtensions
屬性。 針對動態壓縮(例如.asp、.aspx和 .asmx),請將它新增至HcScriptFileExtension
屬性。針對靜態檔案
adsutil.vbs SET w3svc/filters/compression/gzip/HcFileExtensions "htm" "html" "txt"
adsutil.vbs GET w3svc/filters/compression/gzip/HcFileExtensions
上一個指令會顯示下列輸出:
HcFileExtensions : (LIST) (3 Items) "htm" "html" "txt"
針對動態檔案
adsutil.vbs SET w3svc/filters/compression/gzip/HcScriptFileExtensions "asp" "dll" "exe" "aspx" adsutil.vbs get w3svc/filters/compression/gzip/HcScriptFileExtensions
上一個指令會顯示下列輸出:
HcFileExtensions : (LIST) (4 Items) "asp" "dll" "exe" "aspx"
在 IIS7 中
<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files" minFileSizeForComp="1000"> <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" /> <staticTypes> <add mimeType="text/*" enabled="true" /> <add mimeType="message/*" enabled="true" /> <add mimeType="application/x-javascript" enabled="true" /> <add mimeType="application/atom+xml" enabled="true" /> <add mimeType="application/xaml+xml" enabled="true" /> <add mimeType="*/*" enabled="false" /> </staticTypes> <dynamicTypes> <add mimeType="text/*" enabled="true" /> <add mimeType="message/*" enabled="true" /> <add mimeType="application/x-javascript" enabled="true" /> <add mimeType="*/*" enabled="false" /> </dynamicTypes> </httpCompression> <system.web.extensions> <scripting> <scriptResourceHandler enableCompression="false" /> </scripting> </system.web.extensions>
注意
您必須使用正確的語法來
HcFileExtensions
設定 或HcScriptFileExtensions
屬性。 任何尾端空格或不必要的引號或歸位字元都會造成屬性設定錯誤。 不幸的是, 如果您新增額外的空間,adsutil.vbs 不會顯示錯誤,因此您必須非常小心。 此外,您無法將值複製或貼到命令提示字元或 metabase.xml 檔案中(Metabase 直接編輯),而且必須手動輸入。檢查壓縮是否在主要層級設定,但是由子層級的設定所覆寫。
壓縮會在層級啟用
w3svc/filters/compression
。 不過,可能是透過網站或應用層級的設定來覆寫它。例如,如果您已在
HcDoDynamicCompression
層級設定為TRUE
w3svc/filters/compression
,且默認網站已DoDynamicCompression
設定為FALSE
,則不會針對默認網站的要求回應進行動態壓縮。檢查防病毒軟體程式是否已掃描已儲存壓縮檔案的目錄。
在執行 IIS 的伺服器上啟用壓縮,並從 IIS 壓縮目錄提供 HTTP 要求時,可能會傳回 0 位元組檔案,而不是預期的檔案。
注意
只有在啟用 HTTP 靜態壓縮時,您才會看到這些徵兆。
這是因為在 IIS 伺服器上執行的防病毒軟體正在掃描 IIS 壓縮目錄。
因此,您必須從防病毒軟體的掃描清單中排除 IIS 壓縮目錄。
檢查要求的 URL 是否包含斜線,做為傳遞至執行 DLL 檔案之參數的一部分。
檢查 ISAPI 篩選條件是否修改要求或回應標頭。
ISAPI 正在執行傳送作業,而且不會將完整的 HTTP 標頭集連同實體一起傳送至
HTTP_COMPRESSION::DoDynamicCompression
。 由於DoDynamicCompression
不會從 ISAPI 接收所有數據,因此我們無法壓縮回應。 已看到第三方和/或非Microsoft ISAPIs 將標頭放在針對實體主體的函式或針對 HTTP 標頭所指定之函式中的實體主體,或未提供任何標頭來執行此動作。 發生這種情況時,ISAPI 篩選SF_NOTIFY_SEND_RESPONSE、AddResponseHeaders 或動態壓縮等專案將會失敗。 ISAPI 必須分別將標頭和實體放在正確的位置。檢查回應狀態代碼是否為 200 以外的專案。 在 IIS 6 或 7 中,只有具有 HTTP 200 狀態的回應才會壓縮。
200 以外的狀態代碼回應將不會壓縮。 您必須撰寫 ,
HTTPModule
才能達到相同的目的。檢查要求是否包含
Via: header
,Via headers
指出要求是透過 Proxy 來到 IIS。許多 Proxy 不會正確處理壓縮標頭,並在客戶端不應該處理壓縮數據時提供壓縮數據。 因此,根據預設,當要求具有 Via 標頭時,不允許壓縮的回應。 您可以將中繼基底索引鍵設定
HcNoCompressionForProxies
為 ,True
以覆寫此專案。檢查要求是否為靜態頁面,且回應包含文件頁尾。 檔頁尾會導致靜態壓縮失敗。
檢查靜態壓縮是否無法運作。 如果您在 IIS 的根層級安裝通配符應用程式對應,可能會發生這種情況。 例如,我們有伺服器上.html或.txt延伸模組的應用程式對應,這會使 IIS 考慮將要求.txt為動態要求,而不是靜態要求,因為.txt不是動態壓縮清單中的延伸模組,所以不會壓縮。
檢查 IIS 壓縮和
Accept-Encoding: identity
欄位是否存在。根據RFC2616,如果
Accept-Encoding
要求中有字段,而且伺服器無法根據Accept-Encoding
標頭傳送回應,則伺服器應該傳送具有 406(不可接受)狀態代碼的錯誤回應。 如果要求中沒有Accept-Encoding
欄位,伺服器可能會假設用戶端會接受任何內容編碼。 在此情況下,如果「身分識別」是其中一個可用的內容代碼,則伺服器應該使用「身分識別」內容程序代碼,除非它有其他資訊,指出不同的內容程式代碼對用戶端有意義。檢查您是否使用 ETW 追蹤來針對 IIS 壓縮問題進行疑難解答。
Windows 事件追蹤 (ETW) 是 Windows OS 的功能,可讓您針對 HTTP 要求的問題進行疑難解答。
以下是針對 IIS 壓縮問題進行疑難解答的步驟。
建立名為 IISProviders.txt 的文本檔,並將追蹤內容放入檔案中。IIS:WWW Server“ 是提供者名稱,0xFFFFFFFE表示追蹤所有事件,5 表示詳細資訊層級。
開啟命令提示字元,然後執行下列命令。
logman start trace compressionTrace -pf IISProviders.txt -ets
重現問題。
執行下列命令以停止追蹤。
logman stop trace compressionTrace -ets
將追蹤轉換成文本檔。
追蹤報表會將二進位追蹤資料轉換成文字,並在您執行
tracerpt
命令的目錄中產生兩個檔案:tracerpt compressionTrace.etl
Summary.txt包含追蹤會話的一般詳細數據,包括所使用的提供者。
DumpFile.csv包含文字格式的實際追蹤數據。
讀取追蹤檔案以尋找有用的資訊。 開啟dumpfile.csv,並尋找關鍵詞,例如 COMPRESSION_NOT_SUCCESS。 以下是範例:
IISCompression, STATIC_COMPRESSION_NOT_SUCCESS, 0x000008B0, 129744354075770195, 0, 0, {00000000-0000-0000-0700-0060000000bd}, "NO_MATCHING_SCHEME", 0, 0
此錯誤NO_MATCHING_SCHEME表示此延伸模組或 Accept-Encoding 沒有壓縮配置相符。 如需壓縮錯誤的詳細清單,請參閱 壓縮錯誤清單。
檢查是否使用 FREB 追蹤來針對 IIS 壓縮問題進行疑難解答。
如需詳細步驟,請參閱 在 IIS 7 中使用追蹤對失敗的要求進行疑難解答。
以下是使用 IIS 7 FREB 追蹤針對壓縮問題進行疑難解答的範例。
壓縮錯誤清單
如需壓縮錯誤的詳細清單,請參閱下表。
注意
下列原因適用於 IIS 6 和 IIS 7。
原因 | 描述 |
---|---|
NO_ACCEPT_ENCODING | 用戶端不會傳送接受編碼。 |
COMPRESSION_DISABLED | 壓縮已停用,因為找不到適當的組態。 |
NO_COMPRESSION_10 | 伺服器未設定為壓縮 1.0 要求。 |
NO_COMPRESSION_PROXY | 伺服器未設定為壓縮 Proxy 要求。 |
NO_MATCHING_SCHEME | 此延伸模組/Accept-Encoding 沒有壓縮配置相符。 |
UNKNOWN_ERROR | 未知的誤差。 |
NO_COMPRESSION_RANGE | 伺服器未設定為壓縮範圍要求 |
FILE_TOO_SMALL | 檔案小於壓縮閾值。 |
FILE_ENCRYPTED | 檔案加密。 |
COMPRESS_FILE_NOT_FOUND | 壓縮的復本不存在。 |
COMPRESS_FILE_STALE | 壓縮的複本已過期。 |
NO_MATCHING_CONTENT_TYPE | 伺服器未設定為壓縮此延伸模組的內容類型。 |
HEADERS_SENT_TWICE | 針對相同的回應傳送兩次標頭。 |
NO_HEADER_SENT | 實體主體傳送之前未傳送任何標頭。 |
NOT_SUCCESS_STATUS | 回應狀態代碼未成功 (200)。 |
ALREADY_CONTENT_ENCODING | 回應中已經有內容編碼。 |
注意
下列原因僅適用於 IIS 7。
原因 | 描述 |
---|---|
FOOTER_ENABLED | 針對靜態檔案啟用文件頁尾。 |
NOT_FREQUENTLY_HIT | URL 要求的頻率不足,無法證明壓縮的合理性。 |
FAIL_TO_COMPRESS | 無法建立壓縮的複本。 |