Solución de problemas de compresión de IIS en IIS 6 o IIS 7.x
Se aplica a: Internet Information Services 6.0, Internet Information Services 7.0 y versiones posteriores
Información general
Habilitar la compresión HTTP para las aplicaciones web iiS 6 o 7 es una manera de aumentar el rendimiento del sitio.
Muchas de las propiedades de compresión necesarias para administrar IIS completamente no están expuestas por la GUI de administrador. Simplemente ofrece un interruptor encendido o apagado. Por lo tanto, para habilitar completamente la compresión HTTP, debe usar una herramienta distinta del Administrador de IIS para actualizar el archivo metabase.xml . La herramienta más común que se usa es adsutil.vbs, que se incluye en el directorio de instalación de IIS.
Este artículo le ayuda a configurar la compresión e identifica las razones comunes por las que es posible que la compresión de IIS no funcione en IIS 6 e IIS 7.x.
Herramientas usadas en este solucionador de problemas
- Fiddler
- Process Monitor
- ACL de Metabase
- Seguimiento FREB de IIS 7
Comprobación
Determinar si la compresión funciona
La única manera de determinar si el servidor IIS envió una respuesta comprimida es mediante el análisis de un seguimiento de red de la solicitud de cliente y la respuesta del servidor. La solicitud del cliente debe contener el siguiente encabezado de solicitud HTTP:
HTTP: Accept-Encoding =gzip, deflate
Esto permite al servidor saber que el cliente está dispuesto a recibir una respuesta comprimida y admite la compresión. A cambio, una respuesta comprimida del servidor contendrá el siguiente encabezado de respuesta HTTP y un valor:
HTTP: Content-Encoding = gzip
Las capturas de pantalla siguientes muestran la salida de la herramienta Fiddler cuando la compresión no funciona:
Solución de problemas de compresión
Realice los pasos siguientes para solucionar problemas de compresión:
Habilite la compresión en IIS 6 o IIS 7.
En el Administrador de IIS, haga clic con el botón derecho en el nodo Sitios web, seleccione Propiedades y, a continuación, seleccione Servicios.
Especifique la carpeta de compresión y los permisos.
IIS almacena archivos comprimidos en una carpeta, que se puede configurar. De forma predeterminada, es
%windir%\IIS Temporary Compressed Files
para IIS 6 y%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files
para IIS 7.IIS_WPG (IIS_IURS para IIS 7) debe tener permiso de control total para esta carpeta. Use el Monitor de procesos para solucionar este tipo de problema de permiso.
Compruebe si la compresión está habilitada en Metabase.xml.
La compresión no está activada en la metabase en los nodos correctos. Hay tres nodos de metabase para la configuración de compresión:
w3svc/filters/compression/parameters
w3svc/filters/compression/gzip
w3svc/filters/compression/deflate
La configuración del
/parameters
nodo es obligatoria. A continuación, puede configurar/gzip
o/deflate
nodo, o ambos. Esto significa que la configuración solo de los nodos gzip, deflate o parámetros no funcionará. Si configura los/parameters
nodos y/gzip
, se habilitará el esquema de compresión Gzip. Si configura los/parameters
nodos y/deflate
, se habilitará el esquema de compresión Deflate. Por último, si configura los tres nodos, se habilitará la compresión GZip y la compresión Deflate.Compruebe el permiso de metabase para IIS 6.
De forma predeterminada,
IIS_WPG
tiene permisos Read, Unsecure Read, Enumerate Keys y Write en/LM/W3SVC/Filters
.IIS no podrá inicializar la compresión si los permisos se quitaron debido a un cambio inesperado o si se protege la seguridad.
Use metaacl.vbs para comprobar y modificar la ACL de metabase de IIS 6. Para obtener más información, consulte ACL de metabase predeterminada.
Si la identidad del grupo de aplicaciones (o el
IIS_WPG
grupo en general) no tiene acceso de lectura y escritura a la clave de metabase W3SVC o Filtros, se registrará una condición deCOMPRESSION_DISABLED
error en un seguimiento de Seguimiento de empresa para Windows (ETW).Seguimiento de ETW
IISCompression: STATIC_COMPRESSION_NOT_SUCCESS - IIS has been unsuccessful doing static compression Reason: COMPRESSION_DISABLED
Compruebe si la compresión dinámica o estática está desactivada en Metabase.xml.
En cada uno de los tres nodos de configuración (
/parameters
,/gzip
, y/deflate
), tiene la opción de habilitar la compresión estática o dinámica. Para habilitar la compresión estática para tipos de archivo como .txt y .html, debe establecer laHcDoStaticCompression
clave1
en (oTRUE
). Para habilitar la compresión dinámica para tipos de archivo como .asp, .aspx, .asmx o .exe, debe establecer laHcDoDynamicCompression
clave1
en (oTRUE
).Por ejemplo, para establecer la compresión dinámica en el
/parameters
nodo, ejecute el siguiente comando mediante adsutil.vbs:cscript.exe adsutil.vbs SET w3svc/filters/compression/parameters/HcDoDynamicCompression TRUE
La salida del comando anterior tiene el siguiente aspecto:
HcDoDynamicCompression : (BOOLEAN) True
En IIS7
<system.webServer> <urlCompression doStaticCompression="true" doDynamicCompression="true" /> </system.webServer>
Compruebe si el tipo de archivo que desea comprimir aparece en las secciones Extensiones de archivo adecuadas en los
/gzip
nodos y/deflate
.Después de activar la compresión con las claves o
HcDoStaticCompression
,HcDoDynamicCompression
especifique qué tipos de archivo deben comprimirse realmente. De forma predeterminada, la compresión STATIC usa tipos de archivo como .htm, .html y .txt y compresión DYNAMIC usa .asp, .dll y .exe. Si desea comprimir diferentes tipos de archivo, por ejemplo, .aspx, agréguelo a la sección de extensión de archivo adecuada en los/gzip
nodos o/deflate
, según el tipo de compresión que use. Para la compresión de archivos estáticos (como .html, txt y xml), agregue las extensiones de archivo a laHcFileExtensions
propiedad . Para la compresión dinámica (como .asp, .aspx y .asmx), agréguela a laHcScriptFileExtension
propiedad .Para archivos estáticos
adsutil.vbs SET w3svc/filters/compression/gzip/HcFileExtensions "htm" "html" "txt"
adsutil.vbs GET w3svc/filters/compression/gzip/HcFileExtensions
El comando anterior muestra la siguiente salida:
HcFileExtensions : (LIST) (3 Items) "htm" "html" "txt"
Para archivos dinámicos
adsutil.vbs SET w3svc/filters/compression/gzip/HcScriptFileExtensions "asp" "dll" "exe" "aspx" adsutil.vbs get w3svc/filters/compression/gzip/HcScriptFileExtensions
El comando anterior muestra la siguiente salida:
HcFileExtensions : (LIST) (4 Items) "asp" "dll" "exe" "aspx"
En 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:
Debe configurar las
HcFileExtensions
propiedades oHcScriptFileExtensions
con la sintaxis correcta. Los espacios finales o las comillas o devoluciones de carro innecesarias harán que la propiedad esté mal configurada. Desafortunadamente, adsutil.vbs no muestra un error si agrega un espacio adicional, por lo que debe tener mucho cuidado. Además, no puede copiar ni pegar los valores en un símbolo del sistema o en el archivo metabase.xml (metabase direct-edit) y debe escribirlo manualmente.Compruebe si la compresión se establece en el nivel maestro, pero se invalida mediante una configuración en un nivel secundario.
La compresión se habilitaría en el
w3svc/filters/compression
nivel . Sin embargo, puede ser que se invalide mediante una configuración en el nivel de sitio web o aplicación.Por ejemplo, si ha
HcDoDynamicCompression
establecidoTRUE
en en elw3svc/filters/compression
nivel y, para el sitio web predeterminado, laDoDynamicCompression
FALSE
compresión dinámica no se producirá para las respuestas a las solicitudes del sitio web predeterminado.Compruebe si un programa antivirus ha examinado el directorio donde se guardan los archivos comprimidos.
Cuando la compresión está habilitada en un servidor que ejecuta IIS y se proporciona una solicitud HTTP desde el directorio de compresión de IIS, es posible que se devuelva un archivo de 0 bytes en lugar del archivo esperado.
Nota:
Es posible que solo vea estos síntomas si la compresión estática HTTP está habilitada.
Esto sucede porque un software antivirus que se ejecuta en el servidor IIS está examinando el directorio de compresión de IIS.
Por lo tanto, tendría que excluir el directorio de compresión de IIS de la lista de exámenes del software antivirus.
Comprobar si la dirección URL que se solicita contiene una barra diagonal como parte de los parámetros pasados al archivo DLL en ejecución.
Compruebe si los filtros ISAPI modifican los encabezados de solicitud o respuesta.
IsAPI está realizando la operación de envío y no envía el conjunto completo de encabezados HTTP junto con la entidad a
HTTP_COMPRESSION::DoDynamicCompression
. PuestoDoDynamicCompression
que no recibe todos los datos de ISAPI, no se puede comprimir la respuesta. Se ha visto que los ISAPIs de terceros o que no son de Microsoft lo hacen colocando los encabezados en la función pensada para el cuerpo de la entidad o el cuerpo de la entidad en la función diseñada para los encabezados HTTP o no proporcionando ningún encabezado. Cuando esto sucede, se producirá un error en la compresión dinámica, como el filtro ISAPI SF_NOTIFY_SEND_RESPONSE o AddResponseHeaders. La ISAPI debe colocar los encabezados y la entidad en las ubicaciones correctas, respectivamente.Compruebe si el código de estado de respuesta es distinto de 200. En IIS 6 o 7, solo se comprimirán las respuestas con un estado HTTP 200.
La respuesta con códigos de estado distintos de 200 no se comprimirá. Tiene que escribir un
HTTPModule
para lograr lo mismo.Compruebe si la solicitud contiene un
Via: header
,Via headers
indica que la solicitud llega a IIS a través de un proxy.Muchos servidores proxy no controlan correctamente el encabezado de compresión y proporcionan datos comprimidos a los clientes cuando no se supone que lo hacen. Por lo tanto, de forma predeterminada, las respuestas comprimidas no se permiten cuando la solicitud tiene un encabezado Via. Para invalidar esto, establezca la
HcNoCompressionForProxies
clave de metabase enTrue
.Compruebe si la solicitud es para una página estática y la respuesta contiene el pie de página del documento. Los pies de página de documentos harán que se produzca un error en la compresión estática.
Compruebe si la compresión estática no funciona. Esto puede ocurrir si tiene instalada una asignación de aplicación comodín en el nivel raíz de IIS. Por ejemplo, tenemos asignaciones de aplicaciones para las extensiones de .html o .txt en el servidor y esto hará que IIS tenga en cuenta las solicitudes para .txt como solicitudes dinámicas en lugar de estáticas y, dado que .txt no es una extensión en la lista de compresión dinámica, no se comprime.
Compruebe si la compresión de IIS y
Accept-Encoding: identity
el campo está presente.Por RFC2616, si un
Accept-Encoding
campo está presente en una solicitud y si el servidor no puede enviar una respuesta, que es aceptable según elAccept-Encoding
encabezado, el servidor debe enviar una respuesta de error con el código de estado 406 (no aceptable). Si no hay ningúnAccept-Encoding
campo presente en una solicitud, el servidor podría suponer que el cliente aceptará cualquier codificación de contenido. En este caso, si "identity" es uno de los códigos de contenido disponibles, el servidor debe usar el código de contenido "identity", a menos que tenga información adicional que un código de contenido diferente sea significativo para el cliente.Compruebe si usa el seguimiento de ETW para solucionar problemas de compresión de IIS.
El seguimiento de eventos para Windows (ETW) es una característica del sistema operativo Windows que permite solucionar problemas con las solicitudes HTTP.
Estos son los pasos para solucionar problemas de compresión de IIS.
Cree un archivo de texto denominado IISProviders.txt y coloque el contenido de seguimiento en el archivo". IIS: SERVIDOR WWW" es el nombre del proveedor, 0xFFFFFFFE significa seguimiento para todos los eventos y 5 significa nivel detallado.
Abra un símbolo del sistema y ejecute el siguiente comando.
logman start trace compressionTrace -pf IISProviders.txt -ets
Reproduce el problema.
Ejecute el siguiente comando para detener el seguimiento.
logman stop trace compressionTrace -ets
Convierta el seguimiento en un archivo de texto.
El informe de seguimiento convierte los datos de seguimiento binarios en texto y genera dos archivos en el directorio donde ejecutó el
tracerpt
comando:tracerpt compressionTrace.etl
Summary.txt contiene detalles generales sobre la sesión de seguimiento, incluidos los proveedores que se usaron.
DumpFile.csv contiene los datos de seguimiento reales en un formato de texto.
Lea el archivo de seguimiento para encontrar información útil. Abra el dumpfile.csv y busque una palabra clave como COMPRESSION_NOT_SUCCESS. Este es un ejemplo:
IISCompression, STATIC_COMPRESSION_NOT_SUCCESS, 0x000008B0, 129744354075770195, 0, 0, {00000000-0000-0000-0700-0060000000bd}, "NO_MATCHING_SCHEME", 0, 0
Este error NO_MATCHING_SCHEME significa que no había coincidencias de esquema de compresión para esta extensión o Accept-Encoding. Para obtener una lista detallada de errores de compresión, consulte la lista de errores de compresión.
Compruebe si se usa el seguimiento freb para solucionar problemas de compresión de IIS.
Para obtener pasos detallados, consulte Solución de problemas de solicitudes con errores mediante el seguimiento en IIS 7.
Este es un ejemplo del uso del seguimiento freb de IIS 7 para solucionar problemas de compresión.
Lista de errores de compresión
Para obtener una lista detallada de errores de compresión, consulte la tabla siguiente.
Nota:
Las razones siguientes se aplican tanto a IIS 6 como a IIS 7.
Motivo | Descripción |
---|---|
NO_ACCEPT_ENCODING | No hay codificación Accept-Encoding enviada por el cliente. |
COMPRESSION_DISABLED | la compresión está deshabilitada porque no se encontró ninguna configuración adecuada. |
NO_COMPRESSION_10 | Servidor no configurado para comprimir 1.0 solicitudes. |
NO_COMPRESSION_PROXY | El servidor no está configurado para comprimir las solicitudes de proxy. |
NO_MATCHING_SCHEME | No hay coincidencias de esquema de compresión para esta extensión/Accept-Encoding. |
UNKNOWN_ERROR | Error desconocido. |
NO_COMPRESSION_RANGE | Servidor no configurado para comprimir solicitudes de intervalo |
FILE_TOO_SMALL | Archivo menor que el umbral de compresión. |
FILE_ENCRYPTED | Archivo cifrado. |
COMPRESS_FILE_NOT_FOUND | La copia comprimida no existe. |
COMPRESS_FILE_STALE | Copia comprimida no actualizada. |
NO_MATCHING_CONTENT_TYPE | Servidor no configurado para comprimir content-Type para esta extensión. |
HEADERS_SENT_TWICE | Los encabezados que se envían dos veces para la misma respuesta. |
NO_HEADER_SENT | No hay encabezados enviados antes de enviar el cuerpo de la entidad. |
NOT_SUCCESS_STATUS | El código de estado de respuesta no es correcto (200). |
ALREADY_CONTENT_ENCODING | Ya hay una codificación de contenido presente en la respuesta. |
Nota:
Las razones siguientes solo se aplican a IIS 7.
Motivo | Descripción |
---|---|
FOOTER_ENABLED | Pie de página de documento habilitado para archivos estáticos. |
NOT_FREQUENTLY_HIT | La dirección URL no se ha solicitado con frecuencia suficiente para justificar la compresión. |
FAIL_TO_COMPRESS | No se pudo crear la copia comprimida. |