Behandeln von Problemen mit der IIS-Komprimierung in IIS 6 oder IIS 7.x

Gilt für: Internetinformationsdienste 6.0, Internetinformationsdienste 7.0 und höhere Versionen

Übersicht

Das Aktivieren der HTTP-Komprimierung für Ihre IIS 6- oder 7-Webanwendungen ist eine Möglichkeit, die Leistung der Website zu erhöhen.

Viele der Komprimierungseigenschaften, die für die vollständige Verwaltung von IIS erforderlich sind, werden von der Administrator-GUI nicht verfügbar gemacht. Es bietet lediglich einen Ein- oder Aus-Schalter. Um die HTTP-Komprimierung vollständig zu aktivieren, müssen Sie also ein anderes Tool als den IIS-Manager verwenden, um die metabase.xml-Datei zu aktualisieren. Das am häufigsten verwendete Tool ist adsutil.vbs, das im IIS-Installationsverzeichnis enthalten ist.

Dieser Artikel hilft Ihnen beim Konfigurieren der Komprimierung und identifiziert häufige Gründe dafür, warum die IIS-Komprimierung in IIS 6 und IIS 7.x möglicherweise nicht funktioniert.

In dieser Problembehandlung verwendete Tools

  • Fiddler
  • Prozessmonitor
  • Metabasis-ACL
  • IIS 7 FREB-Ablaufverfolgung

Überprüfung

Ermitteln, ob die Komprimierung funktioniert

Die einzige Möglichkeit, festzustellen, ob der IIS-Server eine komprimierte Antwort gesendet hat, besteht darin, eine Netzwerkablaufverfolgung der Clientanforderung und der Serverantwort zu analysieren. Die Anforderung vom Client muss den folgenden HTTP-Anforderungsheader enthalten:

HTTP: Accept-Encoding =gzip, deflate

Dadurch wird der Server darüber informiert, dass der Client bereit ist, eine komprimierte Antwort zu erhalten, und die Komprimierung unterstützt. Im Gegenzug enthält eine komprimierte Antwort vom Server den folgenden HTTP-Antwortheader und einen Wert:

HTTP: Content-Encoding = gzip

Die folgenden Screenshots zeigen die Ausgabe des Fiddler-Tools, wenn die Komprimierung nicht funktioniert:

Screenshot der HTTP-Komprimierung, die auf der Registerkarte

Screenshot eines deaktivierten Abschnitts

Behandeln von Komprimierungsproblemen

Führen Sie die folgenden Schritte aus, um Komprimierungsprobleme zu beheben:

  1. Aktivieren Sie die Komprimierung in IIS 6 oder IIS 7.

    Klicken Sie im IIS-Manager mit der rechten Maustaste auf den Knoten Websites , wählen Sie Eigenschaften und dann Dienste aus.

    Screenshot: HTTP-Komprimierung mit ausgewählter Option

    Screenshot der aktivierten Komprimierungsoptionen mit den Standardwerten.

  2. Geben Sie den Komprimierungsordner und die Berechtigungen an.

    IIS speichert komprimierte Dateien in einem Ordner, der konfiguriert werden kann. Standardmäßig gilt dies %windir%\IIS Temporary Compressed Files für IIS 6 und %SystemDrive%\inetpub\temp\IIS Temporary Compressed Files für IIS 7.

    IIS_WPG(IIS_IURS für IIS 7) muss über die Vollzugriffsberechtigung für diesen Ordner verfügen. Verwenden Sie den Prozessmonitor , um dieses Berechtigungsproblem zu beheben.

  3. Überprüfen Sie, ob die Komprimierung in Metabase.xmlaktiviert ist.

    Die Komprimierung ist in der Metabasis auf den richtigen Knoten nicht aktiviert. Es gibt drei Metabasisknoten für die Komprimierungskonfiguration:

    • w3svc/filters/compression/parameters
    • w3svc/filters/compression/gzip
    • w3svc/filters/compression/deflate

    Die Konfiguration des Knotens /parameters ist obligatorisch. Anschließend können Sie entweder /gzip oder den /deflate Knoten oder beides konfigurieren. Dies bedeutet, dass das Konfigurieren nur der gzip-, deflate- oder Parameterknoten nicht funktioniert. Wenn Sie die /parameters Knoten und /gzip konfigurieren, wird das Gzip-Komprimierungsschema aktiviert. Wenn Sie die /parameters Knoten und /deflate konfigurieren, wird das Deflate-Komprimierungsschema aktiviert. Wenn Sie schließlich alle drei Knoten konfigurieren, werden sowohl die GZip-Komprimierung als auch die Deflate-Komprimierung aktiviert.

  4. Überprüfen Sie die Metabasisberechtigung für IIS 6.

    Standardmäßig verfügt über lese- IIS_WPG , unsichere Lese-, Aufzählungsschlüssel- und Schreibberechtigungen für /LM/W3SVC/Filters.

    IIS kann die Komprimierung nicht initialisieren, wenn die Berechtigungen aufgrund einer unerwarteten Änderung entfernt wurden oder wenn die Sicherheit härtet.

    Verwenden Sie metaacl.vbs , um die IIS 6-Metabasis-ACL zu überprüfen und zu ändern. Weitere Informationen finden Sie unter Standardmetabasis-ACL.

    Wenn die Anwendungspoolidentität (oder die IIS_WPG Gruppe im Allgemeinen) keinen Lese- und Schreibzugriff auf den Metabasisschlüssel W3SVC oder Filter hat, wird eine Fehlerbedingung von COMPRESSION_DISABLED in einer ETW-Ablaufverfolgung (Enterprise Tracing for Windows) protokolliert.

    ETW-Ablaufverfolgung

    IISCompression: STATIC_COMPRESSION_NOT_SUCCESS - IIS has been unsuccessful doing static compression
    Reason: COMPRESSION_DISABLED
    
  5. Überprüfen Sie, ob die dynamische oder statische Komprimierung in Metabase.xmldeaktiviert ist.

    Auf jedem der drei Konfigurationsknoten (/parameters, /gzipund /deflate) haben Sie die Möglichkeit, die statische und/oder dynamische Komprimierung zu aktivieren. Um die statische Komprimierung für Dateitypen wie .txt und .html zu aktivieren, müssen Sie den HcDoStaticCompression Schlüssel auf 1 (oder TRUE) festlegen. Um die dynamische Komprimierung für Dateitypen wie .asp, .aspx, ASMX oder .exe zu aktivieren, müssen Sie den HcDoDynamicCompression Schlüssel auf 1 (oder TRUE) festlegen.

    Um beispielsweise die dynamische Komprimierung auf dem /parameters Knoten festzulegen, führen Sie den folgenden Befehl mit adsutil.vbsaus:

    cscript.exe adsutil.vbs SET w3svc/filters/compression/parameters/HcDoDynamicCompression TRUE
    

    Die Ausgabe des vorherigen Befehls sieht wie folgt aus:

    HcDoDynamicCompression          : (BOOLEAN) True
    

    In IIS7

    <system.webServer>
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />
    </system.webServer>
    
  6. Überprüfen Sie, ob der Dateityp, den Sie komprimieren möchten, in den entsprechenden Abschnitten dateierweiterungen auf den /gzip Knoten und /deflate aufgeführt ist.

    Nachdem Sie die Komprimierung mit den HcDoDynamicCompression Schlüsseln und/oder HcDoStaticCompression aktiviert haben, geben Sie an, welche Dateitypen tatsächlich komprimiert werden müssen. Standardmäßig verwendet die STATIC-Komprimierung Dateitypen wie .htm, .html und .txt, und DYNAMIC-Komprimierung verwendet .asp, .dll und .exe. Wenn Sie verschiedene Dateitypen komprimieren möchten, z. B. .aspx, fügen Sie sie abhängig vom verwendeten Komprimierungstyp dem entsprechenden Dateierweiterungsabschnitt in den /gzip Knoten und-oder /deflate hinzu. Fügen Sie für die statische Dateikomprimierung (z. B. .html, txt und xml) die Dateierweiterungen zur HcFileExtensions -Eigenschaft hinzu. Fügen Sie sie für die dynamische Komprimierung (z. B. .asp, .aspx und ASMX) der HcScriptFileExtension -Eigenschaft hinzu.

    Für statische Dateien

    adsutil.vbs SET w3svc/filters/compression/gzip/HcFileExtensions "htm" "html" "txt"
    
    adsutil.vbs GET w3svc/filters/compression/gzip/HcFileExtensions
    

    Der vorherige Befehl zeigt die folgende Ausgabe an:

    HcFileExtensions : (LIST)  (3 Items)
    "htm"
    "html"
    "txt"
    

    Für dynamische Dateien

    adsutil.vbs SET w3svc/filters/compression/gzip/HcScriptFileExtensions "asp" "dll" "exe" "aspx"
    adsutil.vbs get w3svc/filters/compression/gzip/HcScriptFileExtensions
    

    Der vorherige Befehl zeigt die folgende Ausgabe an:

    HcFileExtensions : (LIST)  (4 Items)
    "asp"
    "dll"
    "exe"
    "aspx"
    

    In 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>
    

    Hinweis

    Sie müssen die HcFileExtensions Eigenschaften oder HcScriptFileExtensions mit der richtigen Syntax konfigurieren. Nachfolgende Leerzeichen oder unnötige Anführungszeichen oder Wagenrückläufe führen dazu, dass die Eigenschaft falsch konfiguriert wird. Leider zeigt adsutil.vbs keinen Fehler an, wenn Sie ein zusätzliches Leerzeichen hinzufügen, sodass Sie sehr vorsichtig sein müssen. Außerdem können Sie die Werte nicht in eine Eingabeaufforderung oder in die metabase.xml-Datei kopieren oder einfügen (direkte Metabasisbearbeitung) und müssen sie manuell eingeben.

  7. Überprüfen Sie, ob die Komprimierung auf der master-Ebene festgelegt ist, aber durch eine Einstellung auf untergeordneter Ebene überschrieben wird.

    Die Komprimierung wird auf der w3svc/filters/compression Ebene aktiviert. Es kann jedoch sein, dass es durch eine Einstellung auf Website- oder Anwendungsebene überschrieben wird.

    Wenn Sie z. B. auf TRUE der -Ebene festgelegt haben HcDoDynamicCompression und für die Standardwebsite auf FALSEfestgelegt habenDoDynamicCompression, erfolgt die dynamische Komprimierung für Antworten auf Anforderungen für die Standardwebsite w3svc/filters/compression nicht.

  8. Überprüfen Sie, ob ein Antivirenprogramm das Verzeichnis überprüft hat, in dem die komprimierten Dateien gespeichert sind.

    Wenn die Komprimierung auf einem Server mit IIS aktiviert ist und eine HTTP-Anforderung aus dem IIS-Komprimierungsverzeichnis bereitgestellt wird, wird möglicherweise anstelle der erwarteten Datei eine 0-Byte-Datei zurückgegeben.

    Hinweis

    Diese Symptome werden möglicherweise nur angezeigt, wenn die statische HTTP-Komprimierung aktiviert ist.

    Dies liegt daran, dass eine Antivirensoftware, die auf dem IIS-Server ausgeführt wird, das IIS-Komprimierungsverzeichnis überprüft.

    Daher müssen Sie das IIS-Komprimierungsverzeichnis aus der Scanliste der Antivirensoftware ausschließen.

  9. Überprüfen Sie, ob die angeforderte URL einen Schrägstrich als Teil der Parameter enthält, die an die ausführende DLL-Datei übergeben werden.

  10. Überprüfen Sie, ob die ISAPI-Filter die Anforderungs- oder Antwortheader ändern.

    Eine ISAPI nimmt den Sendevorgang vor und sendet nicht den vollständigen Satz von HTTP-Headern zusammen mit der Entität an HTTP_COMPRESSION::DoDynamicCompression. Da DoDynamicCompression nicht alle Daten von der ISAPI empfangen werden, können wir die Antwort nicht komprimieren. Drittanbieter- und/oder Nicht-Microsoft-ISAPIs haben dies erreicht, indem sie die Header in die Funktion einfügen, die für den Entitätstext oder den Entitätstext in der Funktion vorgesehen ist, die für die HTTP-Header vorgesehen ist, oder indem keine Header bereitgestellt werden. Wenn dies der Fall ist, schlagen Dinge wie der ISAPI-Filter SF_NOTIFY_SEND_RESPONSE, AddResponseHeaders oder die dynamische Komprimierung fehl. Die ISAPI muss die Header und die Entität an den richtigen Speicherorten platzieren.

  11. Überprüfen Sie, ob die Antwort status Code etwas anderes als 200 ist. In IIS 6 oder 7 werden nur Antworten mit einem HTTP 200-status komprimiert.

    Die Antwort mit status anderen Codes als 200 wird nicht komprimiert. Sie müssen eine HTTPModule schreiben, um dasselbe zu erreichen.

  12. Überprüfen Sie, ob die Anforderung einen Via: headerenthält, der Via headers angibt, dass die Anforderung über einen Proxy an IIS eingeht.

    Viele Proxys behandeln den Komprimierungsheader nicht ordnungsgemäß und stellen komprimierte Daten für Clients bereit, wenn dies nicht der Fall ist. Daher sind die komprimierten Antworten standardmäßig nicht zulässig, wenn die Anforderung über einen Via-Header verfügt. Sie können dies überschreiben, indem Sie den HcNoCompressionForProxies Metabasisschlüssel auf Truefestlegen.

  13. Überprüfen Sie, ob es sich bei der Anforderung um eine statische Seite handelt und die Antwort eine Dokumentfußzeile enthält. Dokumentfußzeilen verursachen einen Fehler bei der statischen Komprimierung.

  14. Überprüfen Sie, ob die statische Komprimierung nicht funktioniert. Dies kann der Fall sein, wenn sie auf der Stammebene in IIS eine Wildcard-Anwendungszuordnung installiert haben. Beispielsweise verfügen wir über Anwendungszuordnungen für die .html- oder .txt-Erweiterungen auf dem Server. Dadurch werden Ihre Anforderungen an .txt von IIS als dynamische Anforderungen anstelle von statisch betrachtet. Da .txt keine Erweiterung in der Liste der dynamischen Komprimierung ist, wird sie nicht komprimiert.

  15. Überprüfen Sie, ob die IIS-Komprimierung und Accept-Encoding: identity das Feld vorhanden sind.

    Wenn pro RFC2616 ein Accept-Encoding Feld in einer Anforderung vorhanden ist und der Server keine Antwort senden kann, was gemäß dem Accept-Encoding Header akzeptabel ist, sollte der Server eine Fehlerantwort mit dem Code 406 (Nicht akzeptabel) status senden. Wenn in einer Anforderung kein Accept-Encoding Feld vorhanden ist, geht der Server möglicherweise davon aus, dass der Client jegliche Inhaltscodierung akzeptiert. Wenn "Identity" einer der verfügbaren Inhaltscodes ist, sollte der Server in diesem Fall den Inhaltscode "Identity" verwenden, es sei denn, er verfügt über zusätzliche Informationen, dass ein anderer Inhaltscode für den Client aussagekräftig ist.

  16. Überprüfen Sie, ob Sie die ETW-Ablaufverfolgung verwenden, um probleme mit der IIS-Komprimierung zu beheben.

    Die Ereignisablaufverfolgung für Windows (ETW) ist ein Feature des Windows-Betriebssystems, mit dem Sie Probleme mit HTTP-Anforderungen beheben können.

    Hier finden Sie die Schritte zur Problembehandlung bei der IIS-Komprimierung.

    1. Erstellen Sie eine Textdatei mit dem NamenIISProviders.txt , und fügen Sie Folgeinhalte in die Datei ein." IIS: WWW-Server" ist der Anbietername, 0xFFFFFFFE bedeutet Ablaufverfolgung für alle Ereignisse, und 5 bedeutet ausführliche Ebene.

    2. Öffnen Sie eine Eingabeaufforderung, und führen Sie den folgenden Befehl aus.

      logman start trace compressionTrace -pf IISProviders.txt -ets
      
    3. Reproduzieren Sie das Problem.

    4. Führen Sie den folgenden Befehl aus, um die Ablaufverfolgung zu beenden.

       logman stop trace compressionTrace -ets
      
    5. Konvertieren Sie die Ablaufverfolgung in eine Textdatei.

      Der Ablaufverfolgungsbericht konvertiert die binären Ablaufverfolgungsdaten in Text und erzeugt zwei Dateien in dem Verzeichnis, in dem Sie den tracerpt Befehl ausgeführt haben:

      tracerpt compressionTrace.etl
      
      • Summary.txt enthält allgemeine Details zur Ablaufverfolgungssitzung, einschließlich der verwendeten Anbieter.

      • DumpFile.csv enthält die tatsächlichen Ablaufverfolgungsdaten in einem Textformat.

    6. Lesen Sie die Ablaufverfolgungsdatei, um nützliche Informationen zu finden. Öffnen Sie die dumpfile.csv, und suchen Sie nach Schlüsselwort (keyword) wie COMPRESSION_NOT_SUCCESS. Hier ist ein Beispiel:

      IISCompression, STATIC_COMPRESSION_NOT_SUCCESS, 0x000008B0, 129744354075770195, 0, 0, {00000000-0000-0000-0700-0060000000bd}, "NO_MATCHING_SCHEME", 0, 0
      

    Dieser Fehler NO_MATCHING_SCHEME bedeutet, dass für diese Erweiterung oder Accept-Encoding keine Komprimierungsschema-Übereinstimmungen aufgetreten sind. Eine ausführliche Liste der Komprimierungsfehler finden Sie in der Liste der Komprimierungsfehler.

  17. Überprüfen Sie, ob die FREB-Ablaufverfolgung zur Behandlung von IIS-Komprimierungsproblemen verwendet wird.

    Ausführliche Schritte finden Sie unter Problembehandlung bei fehlgeschlagenen Anforderungen mithilfe der Ablaufverfolgung in IIS 7.

    Hier ist ein Beispiel für die Verwendung der IIS 7 FREB-Ablaufverfolgung zur Behandlung von Komprimierungsproblemen.

    Screenshot: Nachverfolgen von Komprimierungsproblemen mithilfe der Fehlermeldungen

Liste der Komprimierungsfehler

Eine ausführliche Liste der Komprimierungsfehler finden Sie in der folgenden Tabelle.

Hinweis

Die folgenden Gründe gelten sowohl für IIS 6 als auch für IIS 7.

Grund Beschreibung
NO_ACCEPT_ENCODING Vom Client werden keine Accept-Encoding gesendet.
COMPRESSION_DISABLED Die Komprimierung ist deaktiviert, da keine geeignete Konfiguration gefunden wurde.
NO_COMPRESSION_10 Der Server ist nicht für die Komprimierung von 1.0-Anforderungen konfiguriert.
NO_COMPRESSION_PROXY Der Server ist nicht für die Komprimierung von Proxyanforderungen konfiguriert.
NO_MATCHING_SCHEME Für diese Erweiterung/Accept-Encoding stimmt kein Komprimierungsschema überein.
UNKNOWN_ERROR Unbekannter Fehler.
NO_COMPRESSION_RANGE Server nicht zum Komprimieren von Bereichsanforderungen konfiguriert
FILE_TOO_SMALL Datei, die kleiner als der Komprimierungsschwellenwert ist.
FILE_ENCRYPTED Datei verschlüsselt.
COMPRESS_FILE_NOT_FOUND Eine komprimierte Kopie ist nicht vorhanden.
COMPRESS_FILE_STALE Komprimierte Kopie veraltet.
NO_MATCHING_CONTENT_TYPE Server nicht für die Komprimierung des Inhaltstyps für diese Erweiterung konfiguriert.
HEADERS_SENT_TWICE Header, die zweimal für dieselbe Antwort gesendet werden.
NO_HEADER_SENT Vor dem Senden des Entitätstexts werden keine Header gesendet.
NOT_SUCCESS_STATUS Die Antwort status Code ist nicht erfolgreich (200).
ALREADY_CONTENT_ENCODING In der Antwort ist bereits eine Inhaltscodierung vorhanden.

Hinweis

Die folgenden Gründe gelten nur für IIS 7.

Grund Beschreibung
FOOTER_ENABLED Dokumentfußzeile für statische Dateien aktiviert.
NOT_FREQUENTLY_HIT Die URL wurde nicht häufig genug angefordert, um die Komprimierung zu rechtfertigen.
FAIL_TO_COMPRESS Eine komprimierte Kopie konnte nicht erstellt werden.

Weitere Informationen