Compartir a través de


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:

Captura de pantalla de compresión HTTP establecida en Sin compresión en la pestaña Transformador.

Captura de pantalla de una sección compresión HTTP deshabilitada en la pestaña Transformador.

Solución de problemas de compresión

Realice los pasos siguientes para solucionar problemas de compresión:

  1. 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.

    Captura de pantalla de la compresión HTTP con comprimir archivos estáticos seleccionados y el tamaño máximo del directorio temporal establecido en ilimitado.

    Captura de pantalla de las opciones de compresión habilitadas con los valores predeterminados.

  2. 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.

  3. 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.

  4. 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 de COMPRESSION_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
    
  5. 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 la HcDoStaticCompression clave 1 en (o TRUE). Para habilitar la compresión dinámica para tipos de archivo como .asp, .aspx, .asmx o .exe, debe establecer la HcDoDynamicCompression clave 1 en (o TRUE).

    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>
    
  6. 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 la HcFileExtensions propiedad . Para la compresión dinámica (como .asp, .aspx y .asmx), agréguela a la HcScriptFileExtension 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 o HcScriptFileExtensions 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.

  7. 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 establecido TRUE en en el w3svc/filters/compression nivel y, para el sitio web predeterminado, la DoDynamicCompression FALSEcompresión dinámica no se producirá para las respuestas a las solicitudes del sitio web predeterminado.

  8. 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.

  9. 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.

  10. 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. Puesto DoDynamicCompression 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.

  11. 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.

  12. 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 en True.

  13. 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.

  14. 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.

  15. 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 el Accept-Encoding encabezado, el servidor debe enviar una respuesta de error con el código de estado 406 (no aceptable). Si no hay ningún Accept-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.

  16. 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.

    1. 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.

    2. Abra un símbolo del sistema y ejecute el siguiente comando.

      logman start trace compressionTrace -pf IISProviders.txt -ets
      
    3. Reproduce el problema.

    4. Ejecute el siguiente comando para detener el seguimiento.

       logman stop trace compressionTrace -ets
      
    5. 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.

    6. 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.

  17. 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.

    Captura de pantalla de problemas de compresión de seguimiento mediante los mensajes de error.

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.

Más información