Risoluzione dei problemi di compressione IIS in IIS 6 o IIS 7.x
Si applica a: Internet Information Services 6.0, Internet Information Services 7.0 e versioni successive
Panoramica
L'abilitazione della compressione HTTP per le applicazioni Web IIS 6 o 7 è un modo per aumentare le prestazioni del sito.
Molte delle proprietà di compressione necessarie per gestire completamente IIS non sono esposte dall'interfaccia utente grafica dell'amministratore. Offre semplicemente un interruttore di accensione o spegnimento. Per abilitare completamente la compressione HTTP, è quindi necessario usare uno strumento diverso da Gestione IIS per aggiornare il file metabase.xml . Lo strumento più comune usato è adsutil.vbs, incluso nella directory di installazione di IIS.
Questo articolo consente di configurare la compressione e identifica i motivi comuni per cui la compressione IIS potrebbe non funzionare in IIS 6 e IIS 7.x.
Strumenti usati in questo strumento di risoluzione dei problemi
- Fiddler
- Process Monitor
- Elenco di controllo di accesso della metabase
- Traccia FREB di IIS 7
Verifica
Determinare se la compressione funziona
L'unico modo per determinare se il server IIS ha inviato una risposta compressa consiste nell'analizzare una traccia di rete della richiesta client e della risposta del server. La richiesta dal client deve contenere l'intestazione della richiesta HTTP seguente:
HTTP: Accept-Encoding =gzip, deflate
Ciò consente al server di sapere che il client è disposto a ricevere una risposta compressa e supporta la compressione. In cambio, una risposta compressa dal server conterrà l'intestazione della risposta HTTP seguente e un valore:
HTTP: Content-Encoding = gzip
Gli screenshot seguenti mostrano l'output dello strumento Fiddler quando la compressione non funziona:
Risoluzione dei problemi di compressione
Per risolvere i problemi di compressione, seguire questa procedura:
Abilitare la compressione in IIS 6 o IIS 7.
In Gestione IIS fare clic con il pulsante destro del mouse sul nodo Siti Web , selezionare Proprietà e quindi selezionare Servizi.
Specificare la cartella di compressione e le autorizzazioni.
IIS archivia i file compressi in una cartella, che può essere configurata. Per impostazione predefinita, è
%windir%\IIS Temporary Compressed Files
per IIS 6 e%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files
per IIS 7.IIS_WPG(IIS_IURS per IIS 7) deve disporre dell'autorizzazione di controllo completo per questa cartella. Usare Monitoraggio processi per risolvere questo tipo di problema di autorizzazione.
Verificare se la compressione è abilitata in Metabase.xml.
La compressione non è attivata nella metabase nei nodi giusti. Per la configurazione della compressione sono presenti tre nodi della metabase:
w3svc/filters/compression/parameters
w3svc/filters/compression/gzip
w3svc/filters/compression/deflate
La configurazione del
/parameters
nodo è obbligatoria. È quindi possibile configurare uno/gzip
o un/deflate
nodo o entrambi. Ciò significa che la configurazione solo dei nodi gzip, deflate o parameters non funzionerà. Se si configurano i/parameters
nodi e/gzip
, verrà abilitato lo schema di compressione Gzip. Se si configurano i/parameters
nodi e/deflate
, verrà abilitato lo schema di compressione Deflate. Infine, se si configurano tutti e tre i nodi, verranno abilitati sia la compressione GZip che la compressione deflate.Controllare l'autorizzazione della metabase per IIS 6.
Per impostazione predefinita,
IIS_WPG
dispone delle autorizzazioni Lettura, Lettura non sicura, Enumerazione chiavi e Scrittura per/LM/W3SVC/Filters
.IIS non sarà in grado di inizializzare la compressione se le autorizzazioni sono state rimosse a causa di modifiche impreviste o se la protezione viene avanzata.
Usare metaacl.vbs per verificare e modificare l'ACL della metabase iis 6. Per altre informazioni, vedere ACL della metabase predefinito.
Se l'identità del pool di applicazioni (o il
IIS_WPG
gruppo in generale) non dispone dell'accesso in lettura e scrittura alla chiave della metabase W3SVC o Filters, una condizione di errore diCOMPRESSION_DISABLED
verrà registrata in una traccia ETW (Enterprise Tracing for Windows).Traccia ETW
IISCompression: STATIC_COMPRESSION_NOT_SUCCESS - IIS has been unsuccessful doing static compression Reason: COMPRESSION_DISABLED
Controllare se la compressione dinamica o statica è disattivata in Metabase.xml.
In ognuno dei tre nodi di configurazione (
/parameters
,/gzip
e/deflate
) è possibile abilitare la compressione statica e/o dinamica. Per abilitare la compressione statica per i tipi di file, ad esempio .txt e .html, è necessario impostare laHcDoStaticCompression
chiave su1
(oTRUE
). Per abilitare la compressione dinamica per i tipi di file, ad esempio .asp, .aspx, asmx o .exe, è necessario impostare laHcDoDynamicCompression
chiave su1
(oTRUE
).Ad esempio, per impostare la compressione dinamica nel
/parameters
nodo, eseguire il comando seguente usando adsutil.vbs:cscript.exe adsutil.vbs SET w3svc/filters/compression/parameters/HcDoDynamicCompression TRUE
L'output del comando precedente è simile al seguente:
HcDoDynamicCompression : (BOOLEAN) True
In IIS7
<system.webServer> <urlCompression doStaticCompression="true" doDynamicCompression="true" /> </system.webServer>
Controllare se il tipo di file da comprimere è elencato nelle sezioni appropriate delle estensioni di file nei
/gzip
nodi e/deflate
.Dopo aver attivato la compressione con le
HcDoDynamicCompression
chiavi e/oHcDoStaticCompression
, specificare quali tipi di file devono essere effettivamente compressi. Per impostazione predefinita, la compressione STATIC usa tipi di file come .htm, .html e .txt e la compressione DYNAMIC usa .asp, .dll e .exe. Se si desidera comprimere tipi di file diversi, ad esempio .aspx, aggiungerlo alla sezione di estensione del file appropriata nei/gzip
nodi e-o/deflate
, a seconda del tipo di compressione in uso. Per la compressione di file statici,ad esempio .html, txt e xml, aggiungere le estensioni di file allaHcFileExtensions
proprietà . Per la compressione dinamica,ad esempio .asp, .aspx e asmx, aggiungerla allaHcScriptFileExtension
proprietà .Per i file statici
adsutil.vbs SET w3svc/filters/compression/gzip/HcFileExtensions "htm" "html" "txt"
adsutil.vbs GET w3svc/filters/compression/gzip/HcFileExtensions
Il comando precedente mostra l'output seguente:
HcFileExtensions : (LIST) (3 Items) "htm" "html" "txt"
Per i file dinamici
adsutil.vbs SET w3svc/filters/compression/gzip/HcScriptFileExtensions "asp" "dll" "exe" "aspx" adsutil.vbs get w3svc/filters/compression/gzip/HcScriptFileExtensions
Il comando precedente mostra l'output seguente:
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>
Nota
È necessario configurare le
HcFileExtensions
proprietà oHcScriptFileExtensions
con la sintassi corretta. Eventuali spazi finali, virgolette o ritorni a capo non necessari causeranno un errore di configurazione della proprietà. Sfortunatamente, adsutil.vbs non mostra un errore se si aggiunge uno spazio aggiuntivo, quindi è necessario prestare molta attenzione. Inoltre, non è possibile copiare o incollare i valori in un prompt dei comandi o nel file metabase.xml (modifica diretta della metabase) e digitarli manualmente.Controllare se la compressione è impostata a livello master, ma viene sottoposta a override da un'impostazione a livello figlio.
La compressione verrebbe abilitata a
w3svc/filters/compression
livello. Tuttavia, potrebbe essere che viene sostituito da un'impostazione a livello di sito Web o di applicazione.Ad esempio, se è stato
HcDoDynamicCompression
impostato suTRUE
a livellow3svc/filters/compression
e per il sito WebDoDynamicCompression
predefinito è impostato suFALSE
, la compressione dinamica non verrà eseguita per le risposte alle richieste per il sito Web predefinito.Controllare se un programma antivirus ha analizzato la directory in cui vengono salvati i file compressi.
Quando la compressione è abilitata in un server che esegue IIS e una richiesta HTTP viene gestita dalla directory di compressione IIS, potrebbe essere restituito un file a 0 byte anziché il file previsto.
Nota
Questi sintomi possono essere visualizzati solo se è abilitata la compressione statica HTTP.
Ciò si verifica perché un software antivirus in esecuzione nel server IIS esegue l'analisi della directory di compressione IIS.
È quindi necessario escludere la directory di compressione IIS dall'elenco di analisi del software antivirus.
Controllare se l'URL richiesto contiene una barra come parte dei parametri passati al file DLL in esecuzione.
Controllare se i filtri ISAPI modificano le intestazioni della richiesta o della risposta.
Un ISAPI esegue l'operazione di invio e non invia il set completo di intestazioni HTTP insieme all'entità a
HTTP_COMPRESSION::DoDynamicCompression
. PoichéDoDynamicCompression
non riceve tutti i dati dall'ISAPI, non è possibile comprimere la risposta. A tale scopo sono state rilevate api ISAP di terze parti e/o non Microsoft inserendo le intestazioni nella funzione destinata al corpo dell'entità o al corpo dell'entità nella funzione pensata per le intestazioni HTTP o non fornendo intestazioni. In questo caso, elementi come il filtro ISAPI SF_NOTIFY_SEND_RESPONSE o AddResponseHeaders o la compressione dinamica avranno esito negativo. L'ISAPI deve inserire rispettivamente le intestazioni e l'entità nelle posizioni corrette.Controllare se il codice di stato della risposta è diverso da 200. In IIS 6 o 7 verranno compresse solo le risposte con stato HTTP 200.
La risposta con codici di stato diversi da 200 non verrà compressa. È necessario scrivere un oggetto
HTTPModule
per ottenere lo stesso risultato.Controllare se la richiesta contiene ,
Via: header
indicaVia headers
che la richiesta viene inviata a IIS tramite un proxy.Molti proxy non gestiscono correttamente l'intestazione di compressione e forniscono dati compressi ai client quando non è previsto. Pertanto, per impostazione predefinita, le risposte compresse non sono consentite quando la richiesta ha un'intestazione Via. È possibile eseguire l'override impostando la chiave della
HcNoCompressionForProxies
metabase suTrue
.Controllare se la richiesta è relativa a una pagina statica e la risposta contiene il piè di pagina del documento. I piè di pagina dei documenti causeranno l'esito negativo della compressione statica.
Controllare se la compressione statica non funziona. Questo problema può verificarsi se è installato un mapping di applicazioni con caratteri jolly a livello radice in IIS. Ad esempio, sono disponibili mapping di applicazioni per le estensioni .html o .txt nel server e in questo modo IIS considererà le richieste da .txt come richieste dinamiche anziché statiche e poiché .txt non è un'estensione nell'elenco di compressione dinamica, non viene compressa.
Controllare se il campo Compressione IIS e
Accept-Encoding: identity
è presente.Per RFC2616, se un
Accept-Encoding
campo è presente in una richiesta e se il server non è in grado di inviare una risposta, che è accettabile in base all'intestazioneAccept-Encoding
, il server deve inviare una risposta di errore con il codice di stato 406 (non accettabile). Se non è presente alcunAccept-Encoding
campo in una richiesta, il server potrebbe presumere che il client accetterà qualsiasi codifica di contenuto. In questo caso, se "identity" è uno dei codici di contenuto disponibili, il server deve usare il codice contenuto "identity", a meno che non disponga di informazioni aggiuntive che un altro codice di contenuto sia significativo per il client.Controllare se si usa la traccia ETW per risolvere il problema di compressione IIS.
Event Tracing for Windows (ETW) è una funzionalità del sistema operativo Windows che consente di risolvere i problemi relativi alle richieste HTTP.
Ecco i passaggi per risolvere il problema di compressione IIS.
Creare un file di testo denominato IISProviders.txt e inserire il contenuto follow nel file." IIS: WWW Server" è il nome del provider, 0xFFFFFFFE indica la traccia per tutti gli eventi e 5 indica il livello dettagliato.
Aprire un prompt dei comandi ed eseguire il comando seguente.
logman start trace compressionTrace -pf IISProviders.txt -ets
Riprodurre il problema.
Eseguire il comando seguente per arrestare la traccia.
logman stop trace compressionTrace -ets
Convertire la traccia in file di testo.
Il report di traccia converte i dati di traccia binari in testo e produce due file nella directory in cui è stato eseguito il
tracerpt
comando:tracerpt compressionTrace.etl
Summary.txt contiene dettagli generali sulla sessione di traccia, inclusi i provider usati.
DumpFile.csv contiene i dati di traccia effettivi in formato testo.
Leggere il file di traccia per trovare informazioni utili. Aprire il dumpfile.csve trovare la parola chiave come COMPRESSION_NOT_SUCCESS. Ecco un esempio:
IISCompression, STATIC_COMPRESSION_NOT_SUCCESS, 0x000008B0, 129744354075770195, 0, 0, {00000000-0000-0000-0700-0060000000bd}, "NO_MATCHING_SCHEME", 0, 0
Questo errore NO_MATCHING_SCHEME significa che non sono presenti corrispondenze di schema di compressione per l'estensione o la codifica Accept.This error NO_MATCHING_SCHEME means that there't compression scheme matches for this extension or Accept-Encoding. Per un elenco dettagliato degli errori di compressione, vedere l'elenco degli errori di compressione.
Verificare se viene usata la traccia FREB per risolvere il problema di compressione IIS.
Per i passaggi dettagliati, vedere Risoluzione dei problemi relativi alle richieste non riuscite tramite la traccia in IIS 7.
Ecco un esempio di uso della traccia FREB IIS 7 per risolvere i problemi di compressione.
Elenco degli errori di compressione
Per un elenco dettagliato degli errori di compressione, vedere la tabella seguente.
Nota
I motivi seguenti si applicano sia a IIS 6 che a IIS 7.
Motivo | Descrizione |
---|---|
NO_ACCEPT_ENCODING | Nessun Accept-Encoding inviato dal client. |
COMPRESSION_DISABLED | la compressione è disabilitata perché non è stata trovata alcuna configurazione appropriata. |
NO_COMPRESSION_10 | Server non configurato per comprimere le richieste 1.0. |
NO_COMPRESSION_PROXY | Server non configurato per comprimere le richieste proxy. |
NO_MATCHING_SCHEME | Nessuna corrispondenza di schema di compressione per questa estensione/Accept-Encoding. |
UNKNOWN_ERROR | Errore sconosciuto. |
NO_COMPRESSION_RANGE | Server non configurato per comprimere le richieste di intervallo |
FILE_TOO_SMALL | File inferiore alla soglia di compressione. |
FILE_ENCRYPTED | File crittografato. |
COMPRESS_FILE_NOT_FOUND | La copia compressa non esiste. |
COMPRESS_FILE_STALE | Copia compressa non aggiornata. |
NO_MATCHING_CONTENT_TYPE | Server non configurato per comprimere content-Type per questa estensione. |
HEADERS_SENT_TWICE | Intestazioni inviate due volte per la stessa risposta. |
NO_HEADER_SENT | Nessuna intestazione inviata prima dell'invio del corpo dell'entità. |
NOT_SUCCESS_STATUS | Il codice di stato della risposta non ha esito positivo (200). |
ALREADY_CONTENT_ENCODING | Nella risposta è già presente una codifica del contenuto. |
Nota
I motivi seguenti si applicano solo a IIS 7.
Motivo | Descrizione |
---|---|
FOOTER_ENABLED | Piè di pagina del documento abilitato per i file statici. |
NOT_FREQUENTLY_HIT | L'URL non è stato richiesto abbastanza frequentemente da giustificare la compressione. |
FAIL_TO_COMPRESS | Non è stato possibile creare una copia compressa. |
Ulteriori informazioni
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per