Устранение неполадок со сжатием IIS в IIS 6 или IIS 7.x

Применимо к: Службы IIS 6.0, службы IIS 7.0 и более поздних версий

Обзор

Включение сжатия HTTP для веб-приложений IIS 6 или 7 — это один из способов повышения производительности сайта.

Многие свойства сжатия, необходимые для полного управления IIS, не предоставляются графическим интерфейсом администратора. Он просто предлагает переключатель включения или выключения. Таким образом, чтобы полностью включить сжатие HTTP, необходимо использовать средство, отличное от диспетчера IIS, для обновления файлаmetabase.xml . Чаще всего используется средствоadsutil.vbs, которое входит в каталог установки IIS.

Эта статья поможет вам настроить сжатие и определите распространенные причины, по которым сжатие IIS может не работать в IIS 6 и IIS 7.x.

Средства, используемые в этом средстве устранения неполадок

  • Fiddler
  • Системный монитор
  • Список ACL метабазы
  • Трассировка FREB IIS 7

Проверки

Определение работоспособности сжатия

Единственный способ определить, отправил ли сервер IIS сжатый ответ, — это проанализировать сетевую трассировку клиентского запроса и ответа сервера. Запрос от клиента должен содержать следующий заголовок HTTP-запроса:

HTTP: Accept-Encoding =gzip, deflate

Это позволяет серверу знать, что клиент готов получить сжатый ответ и поддерживает сжатие. В свою очередь сжатый ответ от сервера будет содержать следующий заголовок HTTP-ответа и значение:

HTTP: Content-Encoding = gzip

На следующих снимках экрана показаны выходные данные средства Fiddler, если сжатие не работает:

Снимок экрана: параметр

Снимок экрана: отключенный раздел сжатия HTTP на вкладке

Устранение неполадок со сжатием

Чтобы устранить проблемы со сжатием, выполните следующие действия.

  1. Включите сжатие в IIS 6 или IIS 7.

    В диспетчере IIS щелкните правой кнопкой мыши узел Веб-сайты , выберите Свойства, а затем — Службы.

    Снимок экрана: сжатие HTTP с выбранным параметром Сжатие статических файлов и параметром Максимальный размер временного каталога без ограничений.

    Снимок экрана: включенные параметры сжатия со значениями по умолчанию.

  2. Укажите папку сжатия и разрешения.

    СЛУЖБЫ IIS хранят сжатые файлы в папке, которую можно настроить. По умолчанию он предназначен %windir%\IIS Temporary Compressed Files для IIS 6 и %SystemDrive%\inetpub\temp\IIS Temporary Compressed Files для IIS 7.

    IIS_WPG (IIS_IURS для IIS 7) должны иметь разрешение на полный доступ к этой папке. Используйте монитор процессов для устранения проблем с разрешениями этого типа.

  3. Проверьте, включено ли сжатие в Metabase.xml.

    Сжатие не включено в метабазе на правых узлах. Существует три узла метабазы для конфигурации сжатия:

    • w3svc/filters/compression/parameters
    • w3svc/filters/compression/gzip
    • w3svc/filters/compression/deflate

    Настройка /parameters узла является обязательной. Затем можно настроить либо узел, /deflate либо /gzip и то, и другое. Это означает, что настройка только узлов gzip, deflate или параметров не будет работать. При настройке /parameters узлов и /gzip будет включена схема сжатия Gzip. Если вы настроите /parameters узлы и /deflate , будет включена схема сжатия Deflate. Наконец, если настроить все три узла, будут включены сжатие GZip и deflate.

  4. Проверьте разрешение метабазы для IIS 6.

    По умолчанию IIS_WPG имеет разрешения Чтение, Небезопасное чтение, Перечисление ключей /LM/W3SVC/Filtersи Запись для .

    Службам IIS не удастся инициализировать сжатие, если разрешения были удалены из-за непредвиденного изменения или если безопасность ужесточится.

    Используйте metaacl.vbs для проверки и изменения списка ACL метабазы IIS 6. Дополнительные сведения см. в статье Список ACL метабазы по умолчанию.

    Если удостоверение пула приложений (или IIS_WPG группа в целом) не имеет доступа на чтение и запись к ключу метабазы W3SVC или фильтрам, условие COMPRESSION_DISABLED сбоя будет зарегистрировано в трассировке Enterprise Trace for Windows (ETW).

    Трассировка трассировки трассировки трассиров

    IISCompression: STATIC_COMPRESSION_NOT_SUCCESS - IIS has been unsuccessful doing static compression
    Reason: COMPRESSION_DISABLED
    
  5. Проверьте, отключено ли динамическое или статическое сжатие в Metabase.xml.

    На каждом из трех узлов конфигурации (/parameters, /gzipи /deflate) можно включить статическое и (или) динамическое сжатие. Чтобы включить статическое сжатие для таких типов файлов, как .txt и .html, необходимо задать для HcDoStaticCompression ключа 1 значение (или TRUE). Чтобы включить динамическое сжатие файлов, таких как .asp, .aspx, ASMX или .exe, необходимо задать HcDoDynamicCompression для ключа 1 значение (или TRUE).

    Например, чтобы задать динамическое /parameters сжатие на узле, выполните следующую команду с помощью adsutil.vbs:

    cscript.exe adsutil.vbs SET w3svc/filters/compression/parameters/HcDoDynamicCompression TRUE
    

    Выходные данные предыдущей команды выглядят следующим образом:

    HcDoDynamicCompression          : (BOOLEAN) True
    

    В IIS7

    <system.webServer>
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />
    </system.webServer>
    
  6. Проверьте, указан ли тип файла, который требуется сжать, в соответствующих разделах расширения файлов на /gzip узлах и /deflate .

    После включения сжатия с помощью HcDoDynamicCompression клавиш и (или) HcDoStaticCompression укажите, какие типы файлов должны быть фактически сжаты. По умолчанию для сжатия STATIC используются такие типы файлов, как .htm, .html и .txt, а динамическое сжатие — .asp, .dll и .exe. Если вы хотите сжать файлы разных типов, например .aspx, добавьте его в соответствующий раздел расширения файла в /gzip узлах и или /deflate в зависимости от используемого типа сжатия. Для статического сжатия файлов (например, .html, txt и xml) добавьте расширения файлов в HcFileExtensions свойство . Для динамического сжатия (например, .asp, .aspx и ASMX) добавьте его в HcScriptFileExtension свойство .

    Для статических файлов

    adsutil.vbs SET w3svc/filters/compression/gzip/HcFileExtensions "htm" "html" "txt"
    
    adsutil.vbs GET w3svc/filters/compression/gzip/HcFileExtensions
    

    Предыдущая команда показывает следующие выходные данные:

    HcFileExtensions : (LIST)  (3 Items)
    "htm"
    "html"
    "txt"
    

    Для динамических файлов

    adsutil.vbs SET w3svc/filters/compression/gzip/HcScriptFileExtensions "asp" "dll" "exe" "aspx"
    adsutil.vbs get w3svc/filters/compression/gzip/HcScriptFileExtensions
    

    Предыдущая команда показывает следующие выходные данные:

    HcFileExtensions : (LIST)  (4 Items)
    "asp"
    "dll"
    "exe"
    "aspx"
    

    В 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>
    

    Примечание.

    Необходимо настроить HcFileExtensions свойства или HcScriptFileExtensions с правильным синтаксисом. Любые конечные пробелы, ненужные кавычки или возврат каретки приводят к неправильной настройке свойства. К сожалению, adsutil.vbs не отображает ошибку при добавлении дополнительного места, поэтому необходимо быть очень осторожным. Кроме того, нельзя копировать или вставлять значения в командную строку или в файлmetabase.xml (прямое редактирование метабазы) и вводить их вручную.

  7. Проверьте, задано ли сжатие на уровне master, но переопределяется параметром на дочернем уровне.

    Сжатие будет включено на w3svc/filters/compression уровне . Однако это может быть, что он переопределяется параметром на уровне веб-сайта или приложения.

    Например, если на w3svc/filters/compression уровне задано HcDoDynamicCompression значение TRUE , а для веб-сайта DoDynamicCompression по умолчанию задано значение FALSE, динамическое сжатие не будет выполняться для ответов на запросы веб-сайта по умолчанию.

  8. Проверьте, сканировала ли антивирусная программа каталог, в котором сохраняются сжатые файлы.

    Если сжатие включено на сервере, на котором выполняются службы IIS, а HTTP-запрос обслуживается из каталога сжатия IIS, вместо ожидаемого файла может быть возвращен 0-байтовый файл.

    Примечание.

    Эти симптомы могут возникать только в том случае, если включено статическое сжатие HTTP.

    Это происходит из-за того, что антивирусная программа, запущенная на сервере IIS, сканирует каталог сжатия IIS.

    Таким образом, необходимо исключить каталог сжатия IIS из списка проверки антивирусной программы.

  9. Проверьте, содержит ли запрашиваемый URL-адрес косую черту в составе параметров, передаваемых в исполняемый DLL-файл.

  10. Проверьте, изменяют ли фильтры ISAPI заголовки запросов или ответов.

    ISAPI выполняет операцию отправки и не отправляет полный набор заголовков HTTP вместе с сущностью в HTTP_COMPRESSION::DoDynamicCompression. Так как DoDynamicCompression не получает все данные из ISAPI, мы не можем сжать ответ. Сторонние и (или) сторонние ISAPS были замечены для этого путем помещения заголовков в функцию, предназначенную для тела сущности или тела сущности, в функцию, предназначенную для заголовков HTTP, или путем не предоставления заголовков. В этом случае происходит сбой SF_NOTIFY_SEND_RESPONSE фильтра ISAPI или AddResponseHeaders или динамического сжатия. ISAPI должен поместить заголовки и сущность в нужные расположения соответственно.

  11. Убедитесь, что код состояния ответа отличается от 200. В IIS 6 или 7 будут сжаты только ответы с состоянием HTTP 200.

    Ответ с кодами состояния, отличными от 200, не сжимается. Чтобы достичь того же результата, необходимо написать HTTPModule .

  12. Проверьте, содержит Via: headerли запрос , Via headers указывает, что запрос поступает в IIS через прокси-сервер.

    Многие прокси-серверы неправильно обрабатывают заголовок сжатия и предоставляют сжатые данные клиентам, когда они не должны. Таким образом, по умолчанию сжатые ответы не допускаются, если запрос имеет заголовок Via. Это можно переопределить, задав HcNoCompressionForProxies для ключа метабазы значение True.

  13. Проверьте, предназначен ли запрос для статической страницы, а ответ содержит нижний колонтитул документа. Нижние колонтитулы документа приведут к сбою статического сжатия.

  14. Проверьте, не работает ли статическое сжатие. Это может произойти, если на корневом уровне в IIS установлено сопоставление приложений с подстановочными знаками. Например, у нас есть сопоставления приложений для расширений .html или .txt на сервере, и службы IIS будут рассматривать ваши запросы на .txt как динамические запросы, а не как статические, а так как .txt не является расширением в списке динамического сжатия, он не сжимается.

  15. Проверьте, есть ли в поле Сжатие и Accept-Encoding: identity IIS.

    В RFC2616, если Accept-Encoding поле присутствует в запросе и сервер не может отправить ответ, что приемлемо в соответствии Accept-Encoding с заголовком, сервер должен отправить ответ об ошибке с кодом состояния 406 (не приемлемо). Если в запросе нет Accept-Encoding поля, сервер может предположить, что клиент примет любое кодирование содержимого. В этом случае, если идентификатор является одним из доступных кодов содержимого, сервер должен использовать код содержимого identity, если у него нет дополнительных сведений о том, что другой код содержимого имеет смысл для клиента.

  16. Проверьте, используется ли трассировка трассировки трассировки WINDOWS для устранения проблем со сжатием IIS.

    Трассировка событий Windows (ETW) — это функция ОС Windows, которая позволяет устранять неполадки с HTTP-запросами.

    Ниже приведены инструкции по устранению неполадок со сжатием IIS.

    1. Создайте текстовый файл с именемIISProviders.txt и поместите в файл содержимое. IIS: WWW Server" — это имя поставщика, 0xFFFFFFFE означает трассировку для всех событий, а значение 5 означает уровень детализации.

    2. Откройте командную строку и выполните следующую команду.

      logman start trace compressionTrace -pf IISProviders.txt -ets
      
    3. Воспроизведите проблему.

    4. Выполните следующую команду, чтобы остановить трассировку.

       logman stop trace compressionTrace -ets
      
    5. Преобразуйте трассировку в текстовый файл.

      Отчет трассировки преобразует двоичные данные трассировки в текст и создает два файла в каталоге, в котором вы выполнили tracerpt команду:

      tracerpt compressionTrace.etl
      
      • Summary.txt содержит общие сведения о сеансе трассировки, включая используемые поставщики.

      • DumpFile.csv содержит фактические данные трассировки в текстовом формате.

    6. Прочитайте файл трассировки, чтобы найти полезные сведения. Откройте dumpfile.csvи найдите ключевое слово, например COMPRESSION_NOT_SUCCESS. Пример:

      IISCompression, STATIC_COMPRESSION_NOT_SUCCESS, 0x000008B0, 129744354075770195, 0, 0, {00000000-0000-0000-0700-0060000000bd}, "NO_MATCHING_SCHEME", 0, 0
      

    Эта ошибка NO_MATCHING_SCHEME означает, что не было совпадений схемы сжатия для этого расширения или Accept-Encoding. Подробный список ошибок сжатия см. в разделе Список ошибок сжатия.

  17. Проверьте, используется ли трассировка FREB для устранения неполадок со сжатием IIS.

    Подробные инструкции см. в статье Устранение неполадок с неудачными запросами с помощью трассировки в IIS 7.

    Ниже приведен пример использования трассировки FREB IIS 7 для устранения проблем со сжатием.

    Снимок экрана: проблемы со сжатием трассировки с помощью сообщений об ошибках.

Список ошибок сжатия

Подробный список ошибок сжатия см. в следующей таблице.

Примечание.

Следующие причины относятся к IIS 6 и IIS 7.

Reason Описание
NO_ACCEPT_ENCODING Нет Accept-Encoding, отправленных клиентом.
COMPRESSION_DISABLED сжатие отключено, так как подходящая конфигурация не найдена.
NO_COMPRESSION_10 Сервер не настроен для сжатия запросов версии 1.0.
NO_COMPRESSION_PROXY Сервер не настроен для сжатия запросов прокси-сервера.
NO_MATCHING_SCHEME Схема сжатия не соответствует для этого расширения или accept-Encoding.
UNKNOWN_ERROR Неизвестная ошибка.
NO_COMPRESSION_RANGE Сервер не настроен для сжатия запросов диапазона
FILE_TOO_SMALL Файл меньше порогового значения сжатия.
FILE_ENCRYPTED Файл зашифрован.
COMPRESS_FILE_NOT_FOUND Сжатая копия не существует.
COMPRESS_FILE_STALE Сжатые копии устарели.
NO_MATCHING_CONTENT_TYPE Сервер не настроен для сжатия content-Type для этого расширения.
HEADERS_SENT_TWICE Заголовки отправляются дважды для одного и того же ответа.
NO_HEADER_SENT Заголовки не отправляются до отправки текста сущности.
NOT_SUCCESS_STATUS Код состояния ответа не выполнен (200).
ALREADY_CONTENT_ENCODING В ответе уже есть кодирование содержимого.

Примечание.

Следующие причины относятся только к IIS 7.

Reason Описание
FOOTER_ENABLED Нижний колонтитул документа включен для статических файлов.
NOT_FREQUENTLY_HIT URL-адрес запрашивается недостаточно часто, чтобы оправдать сжатие.
FAIL_TO_COMPRESS Не удалось создать сжатую копию.

Дополнительная информация