Freigeben über


Behandeln von IIS-Komprimierungsproblemen 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 Websiteleistung zu erhöhen.

Viele der zum vollständigen Verwalten von IIS erforderlichen Komprimierungseigenschaften werden von der Administrator-GUI nicht verfügbar gemacht. Es bietet lediglich einen Ein- oder Ausschalter. 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 für die IIS-Komprimierung möglicherweise nicht in IIS 6 und IIS 7.x.

In dieser Problembehandlung verwendete Tools

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

Überprüfung

Ermitteln, ob die Komprimierung funktioniert

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

HTTP: Accept-Encoding =gzip, deflate

Dadurch wird dem Server mitgeteilt, dass der Client bereit ist, eine komprimierte Antwort zu erhalten und die Komprimierung zu unterstützen. Im Gegenzug enthält eine komprimierte Antwort des Servers den folgenden HTTP Response-Header 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 auf

Screenshot eines deaktivierten Abschnitts

Behandeln von Komprimierungsproblemen

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

  1. Aktivieren der 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 der HTTP-Komprimierung mit ausgewählten statischen Dateien komprimieren und die maximale temporäre Verzeichnisgröße auf unbegrenzt festgelegt.

    Screenshot der aktivierten Komprimierungsoptionen mit den Standardwerten.

  2. Geben Sie komprimierungsordner und -berechtigungen an.

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

    IIS_WPG (IIS_IURS für IIS 7) muss die volle Kontrollberechtigung für diesen Ordner haben. Verwenden Sie "Prozessüberwachung" , um diese Art eines Berechtigungsproblems zu beheben.

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

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

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

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

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

    Standardmäßig IIS_WPG verfügt über Lese-, Unsecure Read-, Enumerate Keys- und Write-Berechtigungen für die /LM/W3SVC/Filters.

    IIS kann die Komprimierung nicht initialisieren, wenn die Berechtigungen aufgrund unerwarteter Änderungen entfernt wurden oder wenn die Sicherheit härter wird.

    Verwenden Sie metaacl.vbs zum Überprüfen und Ändern der IIS 6-Metabasis-ACL. 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 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.xml deaktiviert ist.

    Bei jedem der drei Konfigurationsknoten (/parametersund /deflate) haben Sie die Möglichkeit, /gzipstatische 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 am /parameters Knoten festzulegen, führen Sie den folgenden Befehl mithilfe von adsutil.vbs aus:

    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 der Dateierweiterungen auf den /gzip Und /deflate Knoten aufgeführt ist.

    Nachdem Sie die Komprimierung mit den HcDoDynamicCompression Und/oder HcDoStaticCompression Schlüsseln aktiviert haben, geben Sie an, welche Dateitypen tatsächlich komprimiert werden müssen. Die STATISCHE Komprimierung verwendet standardmäßig Dateitypen wie .htm, .html und .txt und DYNAMISCHE Komprimierung .asp, .dll und .exe. Wenn Sie unterschiedliche Dateitypen komprimieren möchten, z. B. .aspx, fügen Sie sie abhängig vom verwendeten Komprimierungstyp dem entsprechenden Abschnitt der Dateierweiterung in den /gzip Und-oder-Knoten /deflate hinzu. Fügen Sie bei der statischen 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:

    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:

    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>
    

    Notiz

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

  7. Überprüfen Sie, ob die Komprimierung auf master-Ebene festgelegt ist, aber durch eine Einstellung auf einer untergeordneten Ebene außer Kraft gesetzt wird.

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

    Wenn Sie z. B. auf die w3svc/filters/compression Ebene festgelegt TRUE haben HcDoDynamicCompression und für die Standardwebsite auf "Dynamische Komprimierung" festgelegt FALSEistDoDynamicCompression, tritt keine dynamische Komprimierung für Antworten auf Anforderungen für die Standardwebsite auf.

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

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

    Notiz

    Diese Symptome können möglicherweise nur auftreten, wenn die statische HTTP-Komprimierung aktiviert ist.

    Dies geschieht, da eine Antivirensoftware, die auf dem IIS-Server ausgeführt wird, das IIS-Komprimierungsverzeichnis scannt.

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

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

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

    Eine ISAPI ausführt den Sendevorgang und sendet nicht den vollständigen Satz von HTTP-Headern zusammen mit der Entität an HTTP_COMPRESSION::DoDynamicCompression. Da DoDynamicCompression nicht alle Daten aus der ISAPI empfangen werden, können wir die Antwort nicht komprimieren. Dies wurde von Drittanbietern und/oder nicht von Microsoft stammenden ISAPIs gesehen, indem die Kopfzeilen in die Funktion eingefügt werden, die für den Entitätstext oder den Entitätstext in der Funktion vorgesehen ist, die für die HTTP-Header vorgesehen ist oder keine Header bereitgestellt werden. Wenn dies geschieht, schlagen Dinge wie der ISAPI-Filter SF_NOTIFY_SEND_RESPONSE oder AddResponseHeaders oder die dynamische Komprimierung fehl. Die ISAPI muss die Header und die Entität an den richtigen Stellen platzieren.

  11. Überprüfen Sie, ob der Antwortstatuscode etwas anderes als 200 ist. In IIS 6 oder 7 werden nur Antworten mit einem HTTP 200-Status komprimiert.

    Die Antwort mit anderen Statuscodes als 200 wird nicht komprimiert. Sie müssen einen 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 weitergeleitet wird.

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

  13. Überprüfen Sie, ob die Anforderung für eine statische Seite ist, und die Antwort enthält Dokumentfußzeile. Dokumentfußzeilen führen dazu, dass die statische Komprimierung fehlschlägt.

  14. Überprüfen Sie, ob die statische Komprimierung nicht funktioniert. Dies kann passieren, wenn eine Zuordnung von Wildcardanwendungen auf der Stammebene in IIS installiert ist. Beispielsweise verfügen wir über Anwendungszuordnungen für die .html- oder .txt Erweiterungen auf dem Server. Dadurch wird IIS ihre Anforderungen an .txt als dynamische Anforderungen anstelle von statischen Anforderungen in Betracht ziehen, und 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.

    Pro RFC2616, wenn ein Accept-Encoding Feld in einer Anforderung vorhanden ist und der Server keine Antwort senden kann, die gemäß dem Accept-Encoding Header akzeptabel ist, sollte der Server eine Fehlerantwort mit dem Statuscode 406 (Nicht akzeptabel) senden. Wenn kein Accept-Encoding Feld in einer Anforderung vorhanden ist, geht der Server möglicherweise davon aus, dass der Client eine Inhaltscodierung akzeptiert. Wenn "Identity" einer der verfügbaren Inhaltscodes ist, sollte der Server den Inhaltscode "Identität" verwenden, es sei denn, er enthält zusätzliche Informationen, dass ein anderer Inhaltscode für den Client aussagekräftig ist.

  16. Überprüfen Sie, ob Sie die ETW-Ablaufverfolgung zum Beheben des IIS-Komprimierungsproblems verwenden.

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

    Hier sind die Schritte zur Problembehandlung des IIS-Komprimierungsproblems.

    1. Erstellen Sie eine Textdatei mit dem Namen IISProviders.txt , und fügen Sie den Inhalt 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 im 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 einem Schlüsselwort wie COMPRESSION_NOT_SUCCESS. 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 vorhanden sind. Eine detaillierte Liste der Komprimierungsfehler finden Sie in der Liste der Komprimierungsfehler.

  17. Überprüfen Sie, ob die FREB-Ablaufverfolgung zur Problembehandlung des IIS-Komprimierungsproblems 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 der Komprimierungsprobleme bei der Ablaufverfolgung mithilfe der Fehlermeldungen.

Liste der Komprimierungsfehler

Eine detaillierte Liste der Komprimierungsfehler finden Sie in der folgenden Tabelle.

Notiz

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

Ursache Beschreibung
NO_ACCEPT_ENCODING Keine Vom Client gesendete Accept-Encoding.
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-Codierung stimmen keine Komprimierungsschemas überein.
UNKNOWN_ERROR Unbekannter Fehler.
NO_COMPRESSION_RANGE Server nicht für die Komprimierung von Bereichsanforderungen konfiguriert
FILE_TOO_SMALL Datei kleiner als Komprimierungsschwellenwert.
FILE_ENCRYPTED Datei verschlüsselt.
COMPRESS_FILE_NOT_FOUND Komprimierte Kopie ist nicht vorhanden.
COMPRESS_FILE_STALE Komprimierte Kopie veraltet.
NO_MATCHING_CONTENT_TYPE Der Server ist nicht für die Komprimierung des Inhaltstyps für diese Erweiterung konfiguriert.
HEADERS_SENT_TWICE Kopfzeilen, die zweimal für dieselbe Antwort gesendet werden.
NO_HEADER_SENT Vor dem Senden des Entitätstexts wurden keine Header gesendet.
NOT_SUCCESS_STATUS Der Antwortstatuscode ist nicht erfolgreich (200).
ALREADY_CONTENT_ENCODING In der Antwort ist bereits eine Inhaltscodierung vorhanden.

Notiz

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

Ursache Beschreibung
FOOTER_ENABLED Dokumentfuß für statische Dateien aktiviert.
NOT_FREQUENTLY_HIT DIE URL wurde nicht häufig genug angefordert, um die Komprimierung zu rechtfertigen.
FAIL_TO_COMPRESS Komprimierte Kopie konnte nicht erstellt werden.

Weitere Informationen