Поделиться через


Устранение неполадок с сжатием 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 Настройка узла является обязательной. Затем можно настроить либо узел, либо /gzip /deflate оба узла. Это означает, что настройка только узлов 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 или filters, то условие COMPRESSION_DISABLED сбоя будет зарегистрировано в трассировке Корпоративной трассировки для Windows (ETW).

    Трассировка трассировки 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 укажите, какие типы файлов должны быть фактически сжатыми. По умолчанию статический сжатие использует такие типы файлов, как .htm, .html и .txt, а динамическое сжатие использует .asp, .dll и .exe. Если вы хотите сжать различные типы файлов, например .aspx, добавьте его в соответствующий раздел расширения файла в разделах и /deflate узлах в /gzip зависимости от типа сжатия, которое вы используете. Для сжатия статических файлов (например, .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. Проверьте, задано ли сжатие на главном уровне, но переопределяется параметром на дочернем уровне.

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

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

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

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

    Примечание.

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

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

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

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

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

    ISAPI выполняет операцию отправки и не отправляет полный набор заголовков HTTP вместе с сущностью HTTP_COMPRESSION::DoDynamicCompression. Так как DoDynamicCompression не получает все данные из ISAPI, мы не можем сжать ответ. Сторонние и /или не microsoft ISAPIs были замечены для этого путем размещения заголовков в функции, предназначенной для тела сущности или тела сущности в функции, предназначенной для заголовков HTTP, или без предоставления заголовков. Когда это происходит, такие как фильтр ISAPI, SF_NOTIFY_SEND_RESPONSE или 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. Проверьте, присутствует ли сжатие IIS и Accept-Encoding: identity поле.

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

  16. Проверьте, используется ли трассировка трассировки ETW для устранения неполадок с сжатием 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.

Причина Description
NO_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 Сервер не настроен для сжатия типа контента для этого расширения.
HEADERS_SENT_TWICE Заголовки отправляются дважды для одного ответа.
NO_HEADER_SENT Заголовки, отправленные перед отправкой текста сущности, не отправляются.
NOT_SUCCESS_STATUS Код состояния ответа не выполнен (200).
ALREADY_CONTENT_ENCODING В ответе уже присутствует кодировка содержимого.

Примечание.

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

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

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