Устранение неполадок со сжатием 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
узла является обязательной. Затем можно настроить либо узел,/deflate
либо/gzip
и то, и другое. Это означает, что настройка только узлов 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 или фильтрам, условиеCOMPRESSION_DISABLED
сбоя будет зарегистрировано в трассировке Enterprise Trace for Windows (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
укажите, какие типы файлов должны быть фактически сжаты. По умолчанию для сжатия 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 (прямое редактирование метабазы) и вводить их вручную.Проверьте, задано ли сжатие на уровне master, но переопределяется параметром на дочернем уровне.
Сжатие будет включено на
w3svc/filters/compression
уровне . Однако это может быть, что он переопределяется параметром на уровне веб-сайта или приложения.Например, если на
w3svc/filters/compression
уровне заданоHcDoDynamicCompression
значениеTRUE
, а для веб-сайтаDoDynamicCompression
по умолчанию задано значениеFALSE
, динамическое сжатие не будет выполняться для ответов на запросы веб-сайта по умолчанию.Проверьте, сканировала ли антивирусная программа каталог, в котором сохраняются сжатые файлы.
Если сжатие включено на сервере, на котором выполняются службы IIS, а HTTP-запрос обслуживается из каталога сжатия IIS, вместо ожидаемого файла может быть возвращен 0-байтовый файл.
Примечание.
Эти симптомы могут возникать только в том случае, если включено статическое сжатие HTTP.
Это происходит из-за того, что антивирусная программа, запущенная на сервере IIS, сканирует каталог сжатия IIS.
Таким образом, необходимо исключить каталог сжатия IIS из списка проверки антивирусной программы.
Проверьте, содержит ли запрашиваемый URL-адрес косую черту в составе параметров, передаваемых в исполняемый DLL-файл.
Проверьте, изменяют ли фильтры ISAPI заголовки запросов или ответов.
ISAPI выполняет операцию отправки и не отправляет полный набор заголовков HTTP вместе с сущностью в
HTTP_COMPRESSION::DoDynamicCompression
. Так какDoDynamicCompression
не получает все данные из ISAPI, мы не можем сжать ответ. Сторонние и (или) сторонние ISAPS были замечены для этого путем помещения заголовков в функцию, предназначенную для тела сущности или тела сущности, в функцию, предназначенную для заголовков HTTP, или путем не предоставления заголовков. В этом случае происходит сбой SF_NOTIFY_SEND_RESPONSE фильтра ISAPI или AddResponseHeaders или динамического сжатия. ISAPI должен поместить заголовки и сущность в нужные расположения соответственно.Убедитесь, что код состояния ответа отличается от 200. В IIS 6 или 7 будут сжаты только ответы с состоянием HTTP 200.
Ответ с кодами состояния, отличными от 200, не сжимается. Чтобы достичь того же результата, необходимо написать
HTTPModule
.Проверьте, содержит
Via: header
ли запрос ,Via headers
указывает, что запрос поступает в IIS через прокси-сервер.Многие прокси-серверы неправильно обрабатывают заголовок сжатия и предоставляют сжатые данные клиентам, когда они не должны. Таким образом, по умолчанию сжатые ответы не допускаются, если запрос имеет заголовок Via. Это можно переопределить, задав
HcNoCompressionForProxies
для ключа метабазы значениеTrue
.Проверьте, предназначен ли запрос для статической страницы, а ответ содержит нижний колонтитул документа. Нижние колонтитулы документа приведут к сбою статического сжатия.
Проверьте, не работает ли статическое сжатие. Это может произойти, если на корневом уровне в IIS установлено сопоставление приложений с подстановочными знаками. Например, у нас есть сопоставления приложений для расширений .html или .txt на сервере, и службы IIS будут рассматривать ваши запросы на .txt как динамические запросы, а не как статические, а так как .txt не является расширением в списке динамического сжатия, он не сжимается.
Проверьте, есть ли в поле Сжатие и
Accept-Encoding: identity
IIS.В RFC2616, если
Accept-Encoding
поле присутствует в запросе и сервер не может отправить ответ, что приемлемо в соответствииAccept-Encoding
с заголовком, сервер должен отправить ответ об ошибке с кодом состояния 406 (не приемлемо). Если в запросе нетAccept-Encoding
поля, сервер может предположить, что клиент примет любое кодирование содержимого. В этом случае, если идентификатор является одним из доступных кодов содержимого, сервер должен использовать код содержимого identity, если у него нет дополнительных сведений о том, что другой код содержимого имеет смысл для клиента.Проверьте, используется ли трассировка трассировки трассировки WINDOWS для устранения проблем со сжатием 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.
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 | Не удалось создать сжатую копию. |
Дополнительная информация
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по