共用方式為


針對 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 工具的輸出:

HTTP 壓縮在 [轉換器] 索引標籤中設定為 [無壓縮] 的螢幕快照。

[轉換器] 索引標籤中已停用 HTTP 壓縮區段的螢幕快照。

針對壓縮問題進行疑難解答

執行下列步驟來針對壓縮問題進行疑難解答:

  1. 在 IIS 6 或 IIS 7 中啟用壓縮。

    從 IIS 管理員,以滑鼠右鍵按兩下 [網站] 節點,選取 [屬性],然後選取 [ 服務]。

    已選取 [壓縮靜態檔案] 和 [暫存目錄大小上限] 設定為無限制的 HTTP 壓縮螢幕快照。

    已啟用 [壓縮] 選項的螢幕快照,其中包含預設值。

  2. 指定壓縮資料夾和許可權。

    IIS 會將壓縮的檔案儲存在可以設定的資料夾中。 根據預設,它 %windir%\IIS Temporary Compressed Files 適用於 IIS 6 和 %SystemDrive%\inetpub\temp\IIS Temporary Compressed Files IIS 7。

    IIS_WPG(IIS 7 IIS_IURS) 必須具有此資料夾的完整控制許可權。 使用 行程監視器 來針對這種類型的許可權問題進行疑難解答。

  3. 檢查是否在 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 壓縮。

  4. 檢查 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
    
  5. 檢查是否在 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>
    
  6. 檢查您要壓縮的檔案類型是否列在 和 /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 直接編輯),而且必須手動輸入。

  7. 檢查壓縮是否在主要層級設定,但是由子層級的設定所覆寫。

    壓縮會在層級啟用 w3svc/filters/compression 。 不過,可能是透過網站或應用層級的設定來覆寫它。

    例如,如果您已在 HcDoDynamicCompression 層級設定為 TRUE w3svc/filters/compression ,且默認網站已 DoDynamicCompression 設定為 FALSE,則不會針對默認網站的要求回應進行動態壓縮。

  8. 檢查防病毒軟體程式是否已掃描已儲存壓縮檔案的目錄。

    在執行 IIS 的伺服器上啟用壓縮,並從 IIS 壓縮目錄提供 HTTP 要求時,可能會傳回 0 位元組檔案,而不是預期的檔案。

    注意

    只有在啟用 HTTP 靜態壓縮時,您才會看到這些徵兆。

    這是因為在 IIS 伺服器上執行的防病毒軟體正在掃描 IIS 壓縮目錄。

    因此,您必須從防病毒軟體的掃描清單中排除 IIS 壓縮目錄。

  9. 檢查要求的 URL 是否包含斜線,做為傳遞至執行 DLL 檔案之參數的一部分。

  10. 檢查 ISAPI 篩選條件是否修改要求或回應標頭。

    ISAPI 正在執行傳送作業,而且不會將完整的 HTTP 標頭集連同實體一起傳送至 HTTP_COMPRESSION::DoDynamicCompression。 由於 DoDynamicCompression 不會從 ISAPI 接收所有數據,因此我們無法壓縮回應。 已看到第三方和/或非Microsoft ISAPIs 將標頭放在針對實體主體的函式或針對 HTTP 標頭所指定之函式中的實體主體,或未提供任何標頭來執行此動作。 發生這種情況時,ISAPI 篩選SF_NOTIFY_SEND_RESPONSE、AddResponseHeaders 或動態壓縮等專案將會失敗。 ISAPI 必須分別將標頭和實體放在正確的位置。

  11. 檢查回應狀態代碼是否為 200 以外的專案。 在 IIS 6 或 7 中,只有具有 HTTP 200 狀態的回應才會壓縮。

    200 以外的狀態代碼回應將不會壓縮。 您必須撰寫 , HTTPModule 才能達到相同的目的。

  12. 檢查要求是否包含 Via: headerVia headers 指出要求是透過 Proxy 來到 IIS。

    許多 Proxy 不會正確處理壓縮標頭,並在客戶端不應該處理壓縮數據時提供壓縮數據。 因此,根據預設,當要求具有 Via 標頭時,不允許壓縮的回應。 您可以將中繼基底索引鍵設定 HcNoCompressionForProxies 為 , True以覆寫此專案。

  13. 檢查要求是否為靜態頁面,且回應包含文件頁尾。 檔頁尾會導致靜態壓縮失敗。

  14. 檢查靜態壓縮是否無法運作。 如果您在 IIS 的根層級安裝通配符應用程式對應,可能會發生這種情況。 例如,我們有伺服器上.html或.txt延伸模組的應用程式對應,這會使 IIS 考慮將要求.txt為動態要求,而不是靜態要求,因為.txt不是動態壓縮清單中的延伸模組,所以不會壓縮。

  15. 檢查 IIS 壓縮和 Accept-Encoding: identity 欄位是否存在。

    根據RFC2616,如果 Accept-Encoding 要求中有字段,而且伺服器無法根據 Accept-Encoding 標頭傳送回應,則伺服器應該傳送具有 406(不可接受)狀態代碼的錯誤回應。 如果要求中沒有 Accept-Encoding 欄位,伺服器可能會假設用戶端會接受任何內容編碼。 在此情況下,如果「身分識別」是其中一個可用的內容代碼,則伺服器應該使用「身分識別」內容程序代碼,除非它有其他資訊,指出不同的內容程式代碼對用戶端有意義。

  16. 檢查您是否使用 ETW 追蹤來針對 IIS 壓縮問題進行疑難解答。

    Windows 事件追蹤 (ETW) 是 Windows OS 的功能,可讓您針對 HTTP 要求的問題進行疑難解答。

    以下是針對 IIS 壓縮問題進行疑難解答的步驟。

    1. 建立名為 IISProviders.txt 的文本檔,並將追蹤內容放入檔案中。IIS:WWW Server“ 是提供者名稱,0xFFFFFFFE表示追蹤所有事件,5 表示詳細資訊層級。

    2. 開啟命令提示字元,然後執行下列命令。

      logman start trace compressionTrace -pf IISProviders.txt -ets
      
    3. 重現問題。

    4. 執行下列命令以停止追蹤。

       logman stop trace compressionTrace -ets
      
    5. 將追蹤轉換成文本檔。

      追蹤報表會將二進位追蹤資料轉換成文字,並在您執行 tracerpt 命令的目錄中產生兩個檔案:

      tracerpt compressionTrace.etl
      
      • Summary.txt包含追蹤會話的一般詳細數據,包括所使用的提供者。

      • DumpFile.csv包含文字格式的實際追蹤數據。

    6. 讀取追蹤檔案以尋找有用的資訊。 開啟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 沒有壓縮配置相符。 如需壓縮錯誤的詳細清單,請參閱 壓縮錯誤清單。

  17. 檢查是否使用 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 無法建立壓縮的複本。

其他相關資訊