Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
di Shoeb Ilyas Bhaldar e Mike Laing
Strumenti usati in questo strumento di risoluzione dei problemi:
- Fiddler
- Network Monitor
- Process Monitor
- Metabase ACL
- Traccia ETW di IIS 6
- Traccia FREB iis 7
Questo materiale viene fornito solo a scopo informativo. Microsoft non riconosce alcuna garanzia, espressa o implicita.
Panoramica
L'abilitazione della compressione HTTP per le applicazioni Web IIS6/7 è un modo per aumentare le prestazioni del sito.
Purtroppo l'interfaccia utente grafica amministratore di IIS non espone molte delle proprietà di compressione necessarie per amministrarla completamente. In esso ci permette solo di attivarlo o disattivarlo. È quindi importante notare che per configurare la compressione HTTP in tutta la sua portata è necessario modificare il metabase.xml usando uno strumento diverso da Gestione IIS. Lo strumento più comune usato è adsutil.vbs, incluso nell'installazione di IIS
Questo strumento di risoluzione dei problemi consente di configurare la compressione per identificare i motivi comuni per cui la compressione & IIS potrebbe non funzionare in IIS6 e IIS 7.x
Verifica
Determinazione del funzionamento della compressione
L'unico modo per determinare se il server IIS ha inviato una risposta compressa consiste nell'analizzare una traccia di rete della risposta di richiesta/server client. La richiesta dal client deve contenere l'intestazione di richiesta HTTP seguente:
HTTP: Accept-Encoding =gzip, deflate
Indica al server che il client supporta la compressione e accetterà una risposta compressa. In cambio, una risposta compressa dal server conterrà l'intestazione di risposta HTTP seguente e un valore:
HTTP: Content-Encoding = gzip
Output di Fiddler quando la compressione non funziona:
Risoluzione dei problemi
Abilitare la compressione in IIS6/IIS7: Da Gestione IIS fare clic con il pulsante destro del mouse sul nodo Siti Web, proprietà e scegliere Servizi.
Cartella di compressione e autorizzazioni su di esso: 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. Monitoraggio processi è uno strumento ideale per risolvere questo tipo di problema di autorizzazione.
Controllare se la compressione è abilitata in Metabase.xml: La compressione non è attivata nella metabase nelle posizioni corrette. Esistono tre percorsi di metabase per la configurazione della compressione:
w3svc/filters/compression/parameters
w3svc/filters/compression/gzip
w3svc/filters/compression/deflate
La configurazione nel percorso /parameters è *obbligatoria*. È quindi necessario configurare in /gzip *o* /deflate, *or* entrambi. Ciò significa che la configurazione solo in /gzip non funzionerà, solo /deflate non funzionerà e solo /parameters non funzionerà. Tuttavia, la configurazione in /parameters e /gzip consentirà lo schema di compressione Gzip. Inoltre, la configurazione di /parameters e /deflate abiliterà lo schema di compressione Deflate. Infine, la configurazione di tutti e tre abiliterà sia la compressione GZip che la compressione Deflate.
Controllare l'autorizzazione metabase per IIS 6: Per impostazione predefinita, IIS_WPG dispone dell'autorizzazione Lettura, Lettura non protetta, Enumerazione chiavi e scrittura per /LM/W3SVC/Filters.
IIS non è in grado di inizializzare la compressione se le autorizzazioni sono state rimosse a causa di modifiche impreviste o protezione avanzata.
Uso di metaacl.vbs per verificare e modificare l'ACL di metabase IIS 6. (
https://www.microsoft.com/download/en/details.aspx?displaylang=en&id=4899
)Se l'identità del pool di applicazioni (o il gruppo di IIS_WPG in generale) non dispone dell'accesso in lettura e scrittura alla chiave di metabase W3SVC/Filtri, verrà registrata una condizione di errore di COMPRESSION_DISABLED 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 percorsi di configurazione (/parameters, /gzip e /deflate), è possibile abilitare la compressione statica e/o dinamica. Per i file statici come txt e html da comprimere, è necessario impostare la chiave HcDoStaticCompression su 1 (o TRUE). Per abilitare la compressione dinamica (per elementi come asp, aspx, asmx, exe) è necessario impostare HcDoDynamicCompression su 1 (o TRUE).
Ad esempio, per impostare la compressione dinamica nel nodo /parameters usando adsutil.vbs, eseguire questo comando:
cscript.exe adsutil.vbs SET w3svc/filters/compression/parameters/HcDoDynamicCompression TRUE
L'output di tale comando è 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 estensioni di file appropriate nei nodi /gzip e /deflate: Dopo aver attivato la compressione con le chiavi HcDoDynamicCompression e/o HcDoStaticCompression, è necessario assicurarsi di indicare a IIS quali tipi di file comprimere effettivamente. Per impostazione predefinita, comprimiamo htm, html e txt per la compressione STATIC e asp, dll ed exe per la compressione DYNAMIC. Se si desidera comprimere tipi di file diversi, ad esempio aspx, è necessario aggiungerlo alla sezione dell'estensione di file appropriata nei nodi /gzip e-o /deflate, a seconda del tipo di compressione in uso. Per la compressione dei file statici ,ad esempio html, txt e xml, aggiungere le estensioni di file alla proprietà HcFileExtensions. Per la compressione dinamica ,ad esempio asp, aspx, asmx, viene aggiunta alla proprietà HcScriptFileExtension.
Per i file statici:
adsutil.vbs SET w3svc/filters/compression/gzip/HcFileExtensions "htm" "html" "txt"
adsutil.vbs get w3svc/filters/compression/gzip/HcFileExtensions
Questo comando restituirà:
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
Questo comando restituirà:
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
La configurazione delle proprietà HcFileExtensions o HcScriptFileExtensions deve essere eseguita con la sintassi corretta. Eventuali spazi finali o virgolette/ritorni a capo non necessari causeranno la configurazione errata della proprietà. Purtroppo adsutil.vbs non genera un errore se si aggiunge uno spazio aggiuntivo, quindi è necessario prestare molta attenzione. Inoltre, copiare/incollare i valori in un prompt dei comandi o nel file di metabase.xml (modifica diretta metabase) è un'idea errata. digitarlo sempre manualmente.
Controllare se la compressione è impostata a livello master, ma viene sottoposta a override da un'impostazione a livello figlio: La compressione viene abilitata a livello di compressione w3svc/filters/compression, tuttavia, se può essere possibile che venga eseguito l'override da un'impostazione a livello di sito Web/applicazione.
Ad esempio: Se HcDoDynamicCompression è impostato su TRUE a livello di compressione w3svc/filters e per il sito Web predefinito è impostato Su FALSE, 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 archiviati i file compressi:
Quando la compressione è abilitata in un server che esegue Internet Information Services (IIS) e viene servita una richiesta HTTP dalla directory di compressione IIS, è possibile che venga 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 a causa di 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.
Filtri ISAPI che modificano le intestazioni di richiesta/risposta:
Un'ISAPI esegue l'operazione di invio e non invia il set completo di intestazioni HTTP insieme all'entità a HTTP_COMPRESSION::D oDynamicCompression. Poiché DoDynamicCompression non riceve tutti i dati che deve essere inviato dall'ISAPI, non è possibile comprimere la risposta. A tale scopo sono state rilevate terze parti e/o non Microsoft ISAPI inserendo le intestazioni nella funzione destinata al corpo dell'entità o al corpo dell'entità nella funzione destinata alle intestazioni HTTP o non fornendo alcuna intestazione. In questo caso, le operazioni come il filtro ISAPI SF_NOTIFY_SEND_RESPONSE o AddResponseHeaders o la compressione dinamica avrà esito negativo. L'ISAPI deve inserire rispettivamente le intestazioni e l'entità nelle posizioni corrette.
Il codice di stato della risposta è diverso da 200. In IIS 6/7, verranno compresse solo le risposte con stato HTTP 200.
Sì, questo vale sia in IIS6 & IIS 7.x, la risposta con codici di stato diversi da 200 non verrà compressa. Per ottenere lo stesso risultato, sarà necessario scrivere un httpModule.
Se la richiesta contiene un'intestazione Via: Le intestazioni Via indicano 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 devono, quindi per impostazione predefinita non sono consentite risposte compresse quando la richiesta ha un'intestazione Via. È possibile eseguire l'override impostando la chiave della metabase HcNoCompressionForProxies su True.
La richiesta è relativa a una pagina statica e la risposta contiene il piè di pagina del documento. I piè di pagina del documento causano un errore di compressione statica.
Compressione statica non funzionante: Questo problema può verificarsi se è installato un mapping di applicazioni con caratteri jolly a livello radice in IIS. Ad esempio, Nel server sono disponibili mapping di applicazioni per le estensioni .html o .txt) e in questo modo IIS considererà le richieste di .txt come richieste dinamiche anziché statiche e poiché .txt non è un'estensione nell'elenco di compressione dinamica, non viene compresso.
Compressione IIS e "Accept-Encoding: identity":
Secondo RFC2616 :
"Se un campo Accept-Encoding è presente in una richiesta e se il server non può inviare una risposta accettabile in base all'intestazione Accept-Encoding, il server DEVE inviare una risposta di errore con il codice di stato 406 (Non accettabile). Se non è presente alcun campo Accept-Encoding in una richiesta, il server PUÒ presupporre che il client accetti qualsiasi codifica del contenuto. In questo caso, se "identity" è uno dei codici di contenuto disponibili, il server DEVE usare la codifica del contenuto "identity", a meno che non disponga di informazioni aggiuntive che una codifica del contenuto diversa sia significativa per il client.
Uso della traccia ETW per risolvere il problema di compressione IIS
Traccia eventi per 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 nel file." IIS: WWW Server" è il nome del provider, 0xFFFFFFFE significa traccia per tutti gli eventi e 5 significa livello dettagliato.
"IIS: WWW Server" 0xFFFFFFFE 5 Per altre informazioni, fare riferimento ai provider IIS: https://technet.microsoft.com/library/cc758221(v=ws.10).aspx
Aprire una finestra dei comandi ed eseguire il comando seguente:
logman start trace compressionTrace -pf IISProviders.txt -ets
Riproduci il problema.
Eseguire il comando follow per arrestare la traccia.
Logman stop trace compressionTrace -ets
Convertire la traccia nel 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 comando di traccia:
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 un formato di testo.
Leggere il file di traccia per trovare informazioni utili. Aprire la dumpfiles.csv e trovare la parola chiave come "COMPRESSION_NOT_SUCCESS". 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 corrisponde alcun schema di compressione per questa estensione/Accept-Encoding. Per un elenco dettagliato degli errori di compressione, fare riferimento alle tabelle nell'appendice.
Uso della traccia FREB per risolvere il problema di compressione IIS
La traccia FREB di IIS 7 è molto più semplice rispetto alla traccia ETW. Per informazioni dettagliate, fare riferimento a questo articolo.
Ecco un esempio di uso della traccia FREB iis 7 per risolvere il problema di compressione.
Per un elenco dettagliato degli errori di compressione, fare riferimento alle tabelle nell'appendice.
Appendice:
Tabella 1: Motivi applicabili 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 dello 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 più piccolo della 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 il tipo di contenuto 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 è riuscito(200) ALREADY_CONTENT_ENCODING Nella risposta è già presente una codifica del contenuto Tabella 2: motivi 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 per giustificare la compressione FAIL_TO_COMPRESS Impossibile creare la copia compressa