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:
Behandeln von Komprimierungsproblemen
Führen Sie die folgenden Schritte aus, um Komprimierungsprobleme zu beheben:
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.
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.
Ü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.Ü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 vonCOMPRESSION_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
Überprüfen Sie, ob die dynamische oder statische Komprimierung in Metabase.xmldeaktiviert ist.
Auf jedem der drei Konfigurationsknoten (
/parameters
,/gzip
und/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 denHcDoStaticCompression
Schlüssel auf1
(oderTRUE
) festlegen. Um die dynamische Komprimierung für Dateitypen wie .asp, .aspx, ASMX oder .exe zu aktivieren, müssen Sie denHcDoDynamicCompression
Schlüssel auf1
(oderTRUE
) 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>
Ü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/oderHcDoStaticCompression
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 zurHcFileExtensions
-Eigenschaft hinzu. Fügen Sie sie für die dynamische Komprimierung (z. B. .asp, .aspx und ASMX) derHcScriptFileExtension
-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 oderHcScriptFileExtensions
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.Ü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 habenHcDoDynamicCompression
und für die Standardwebsite aufFALSE
festgelegt habenDoDynamicCompression
, erfolgt die dynamische Komprimierung für Antworten auf Anforderungen für die Standardwebsitew3svc/filters/compression
nicht.Ü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.
Ü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.
Ü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
. DaDoDynamicCompression
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.Ü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.Überprüfen Sie, ob die Anforderung einen
Via: header
enthält, derVia 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 aufTrue
festlegen.Ü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.
Ü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.
Ü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äß demAccept-Encoding
Header akzeptabel ist, sollte der Server eine Fehlerantwort mit dem Code 406 (Nicht akzeptabel) status senden. Wenn in einer Anforderung keinAccept-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.Ü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.
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.
Öffnen Sie eine Eingabeaufforderung, und führen Sie den folgenden Befehl aus.
logman start trace compressionTrace -pf IISProviders.txt -ets
Reproduzieren Sie das Problem.
Führen Sie den folgenden Befehl aus, um die Ablaufverfolgung zu beenden.
logman stop trace compressionTrace -ets
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.
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.
Ü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.
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. |