Устранение неполадок с сжатием 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, если сжатие не работает:
Устранение неполадок с сжатием
Чтобы устранить проблемы с сжатием, выполните следующие действия.
Включите сжатие в IIS 6 или IIS 7.
В диспетчере IIS щелкните правой кнопкой мыши узел веб-сайтов , выберите "Свойства" и выберите "Службы".
Укажите папку сжатия и разрешения.
СЛУЖБЫ IIS хранят сжатые файлы в папке, которую можно настроить. По умолчанию он предназначен
%windir%\IIS Temporary Compressed Files
для IIS 6 и%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files
для IIS 7.IIS_WPG(IIS_IURS для IIS 7) должен иметь разрешение на полный контроль для этой папки. Используйте монитор процессов для устранения этой проблемы с разрешением.
Проверьте, включена ли сжатие в 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.Проверьте разрешение метабазы для 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
Проверьте, отключена ли динамическое или статическое сжатие в 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>
Проверьте, указан ли тип файла, который нужно сжать, в соответствующих разделах расширений файлов на
/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 (прямой редактирование метабазы) и вводить его вручную.Проверьте, задано ли сжатие на главном уровне, но переопределяется параметром на дочернем уровне.
Сжатие будет включено на
w3svc/filters/compression
уровне. Однако это может быть то, что оно переопределяется параметром на уровне веб-сайта или приложения.Например, если задано
HcDoDynamicCompression
TRUE
w3svc/filters/compression
значение на уровне, а для веб-сайта по умолчанию заданоDoDynamicCompression
FALSE
значение , динамическое сжатие не будет происходить для ответов на запросы веб-сайта по умолчанию.Проверьте, сканирует ли антивирусная программа каталог, в котором сохраняются сжатые файлы.
Если сжатие включено на сервере под управлением IIS, а HTTP-запрос обслуживается из каталога сжатия IIS, то вместо ожидаемого файла может быть возвращен 0-байтовый файл.
Примечание.
Эти симптомы могут отображаться только в том случае, если включена статическое сжатие HTTP.
Это происходит, так как антивирусное программное обеспечение, работающее на сервере IIS, сканирует каталог сжатия IIS.
Таким образом, необходимо исключить каталог сжатия IIS из списка сканирования антивирусного программного обеспечения.
Проверьте, содержит ли запрашиваемый URL-адрес косую черту в составе параметров, переданных в исполняемый DLL-файл.
Проверьте, изменяют ли фильтры ISAPI заголовки запроса или ответа.
ISAPI выполняет операцию отправки и не отправляет полный набор заголовков HTTP вместе с сущностью
HTTP_COMPRESSION::DoDynamicCompression
. Так какDoDynamicCompression
не получает все данные из ISAPI, мы не можем сжать ответ. Сторонние и /или не microsoft ISAPIs были замечены для этого путем размещения заголовков в функции, предназначенной для тела сущности или тела сущности в функции, предназначенной для заголовков HTTP, или без предоставления заголовков. Когда это происходит, такие как фильтр ISAPI, SF_NOTIFY_SEND_RESPONSE или AddResponseHeaders, или динамическое сжатие завершится ошибкой. ISAPI должен поместить заголовки и сущность в правильные расположения соответственно.Проверьте, является ли код состояния ответа не более 200. В IIS 6 или 7 только ответы с состоянием HTTP 200 будут сжаты.
Ответ с кодами состояния, отличными от 200, не будет сжиматься. Вы должны написать
HTTPModule
то же самое.Проверьте, содержит ли запрос объект
Via: header
,Via headers
указывает, что запрос поступает в IIS через прокси-сервер.Многие прокси-серверы не обрабатывают заголовок сжатия правильно и предоставляют сжатые данные клиентам, если они не должны. Таким образом, по умолчанию сжатые ответы не допускаются, если запрос имеет заголовок Via. Это можно переопределить, задав
HcNoCompressionForProxies
для ключа метабазы значениеTrue
.Проверьте, находится ли запрос на статическую страницу, а ответ содержит нижний колонтитул документа. Нижние колонтитулы документов вызывают сбой статического сжатия.
Проверьте, не работает ли статическое сжатие. Это может произойти, если у вас установлено сопоставление приложений с подстановочными знаками на корневом уровне в IIS. Например, у нас есть сопоставления приложений для расширений .html или .txt на сервере, поэтому службы IIS считают ваши запросы .txt как динамические запросы вместо статических и так как .txt не является расширением в динамическом списке сжатия, он не сжимается.
Проверьте, присутствует ли сжатие IIS и
Accept-Encoding: identity
поле.На RFC2616, если
Accept-Encoding
поле присутствует в запросе, и если сервер не может отправить ответ, который является приемлемым в соответствииAccept-Encoding
с заголовком, сервер должен отправить ответ на ошибку с кодом состояния 406 (Не приемлемо). Если в запросе нетAccept-Encoding
поля, сервер может предположить, что клиент примет любое кодирование содержимого. В этом случае, если идентификатор является одним из доступных кодов содержимого, сервер должен использовать код содержимого identity, если у него нет дополнительных сведений о том, что другой код содержимого имеет смысл для клиента.Проверьте, используется ли трассировка трассировки ETW для устранения неполадок с сжатием IIS.
Трассировка событий для Windows (ETW) — это функция ОС Windows, которая позволяет устранять неполадки с HTTP-запросами.
Ниже приведены инструкции по устранению неполадок с сжатием IIS.
Создайте текстовый файл с именем IISProviders.txt и поместите содержимое в файл. IIS: WWW Server" — это имя поставщика, 0xFFFFFFFE означает трассировку для всех событий, а 5 — подробный уровень.
Откройте командную строку и выполните следующую команду.
logman start trace compressionTrace -pf IISProviders.txt -ets
Воспроизведите проблему.
Выполните следующую команду, чтобы остановить трассировку.
logman stop trace compressionTrace -ets
Преобразуйте трассировку в текстовый файл.
Отчет трассировки преобразует двоичные данные трассировки в текст и создает два файла в каталоге, где вы выполнили
tracerpt
команду:tracerpt compressionTrace.etl
Summary.txt содержит общие сведения о сеансе трассировки, включая используемые поставщики.
DumpFile.csv содержит фактические данные трассировки в текстовом формате.
Прочитайте файл трассировки, чтобы найти полезные сведения. Откройте 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 не было совпадений схемы сжатия. Подробный список ошибок сжатия см. в списке ошибок сжатия.
Проверьте, используется ли трассировка 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 | Не удалось создать сжимаемую копию. |