Как я могу заставить сжатие gzip в IIS7 работать?

Я установил статическое и динамическое сжатие для IIS7, а также установил два значения web.config на уровне моего приложения Virtual Folder. Насколько я понимаю, мне больше не нужно включать сжатие на сервере или на уровне сайта, и я могу управлять им в каждой папке, используя мой файл web.config.

У меня есть два параметра в моем файле .config, который я настроил для настройки gzip для моего приложения:

<httpCompression dynamicCompressionDisableCpuUsage="90"
    dynamicCompressionEnableCpuUsage="0">
  <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
  <dynamicTypes>
    <remove mimeType="*/*"/>
    <add mimeType="*/*" enabled="true" />
  </dynamicTypes>
</httpCompression>
<urlCompression doDynamicCompression="true"
    dynamicCompressionBeforeCache="true" />

Однако, когда я запускаю приложение, я могу ясно видеть, что gzip не используется, потому что мои размеры страниц одинаковы. Я также использую YSlow для FireFox, что также подтверждает, что мои страницы не являются gziped.

Что мне здесь не хватает? В IIS6 было просто указать типы файлов и установить уровень сжатия между 0-10. Я не вижу необходимости документировать, чтобы указать типы файлов или уровень сжатия, так как по умолчанию они, по-видимому, охватывают типы файлов, и я нигде не вижу уровня.

Ответ 1

На форуме forums.iis.net появилась информация об этом во время бета-тестирования iis 7. Оказалось, что у парня не было установленных модулей, но похоже, что вы приняли это решение из вашего вступительного предложения.

Основные рекомендации Microsoft для него заключались в том, чтобы включить отслеживание неудачных запросов, чтобы выяснить, что происходит не так. Возможно, это одна из самых недооцененных функций IIS7, но, безусловно, одна из самых мощных.

  • Откройте диспетчер IIS.
  • Перейдите на свой сайт, а на панели действий (очень далеко) нажмите "Сбой запроса..." в разделе "Настроить".
  • Нажмите "включить".
  • Затем в представлении свойств щелкните "Правила отслеживания неудачных запросов". Нажмите "Добавить", затем введите 200 для кода состояния, затем нажмите "Готово".

Если вы не видите "Трассировка неудачных запросов" в панели действий, вам нужно добавить эту функцию на сервер - либо с помощью мастера "Добавить службы ролей" ( "Здоровье и диагностика/Трассировка" ), либо через Установщик веб-платформы (Продукты\Сервер\IIS: Трассировка), а затем закройте и заново открыть диспетчер IIS.

Затем повторите тест. Это создаст некоторую информацию о журнале для нас.

Посмотрите в c:\inetpub\logs\FailedReqLogFiles\w3svcx. Вы увидите кучу файлов с именем fr000xx.xml. Откройте любой из них в своем браузере. (Кстати, если вы копируете эти файлы в любом месте, убедитесь, что у него есть freb.xsl. Также не удаляйте freb.xsl - если вы это делаете, просто удалите весь каталог или скопируйте его из другого места, поскольку только IIS создает это один раз для каждой папки.)

Перейдите на вкладку "Сведения о запросе" и выберите "полная трассировка запроса". Найдите страницу для "compress" - вы должны найти ее в нескольких областях; один раз для статического содержимого и один раз для динамического содержимого.

Если вы не найдете ни одного из них, IIS настроен неправильно. Если вы их найдете, вы должны увидеть их, за которыми следуют сжатие_success и compression_do. Успех самоочевиден; "do" указывает, что он сделал - в моем случае он показал "OriginalSize 1462784 CompressedSize 179482"

Поскольку ваш не работает, надеюсь, вы увидите что-то другое, что поможет вам решить проблему.

Убедитесь, что вы отключили это, когда закончите, отключив трассировку неудачных запросов в панели действий для вашего веб-сайта.

Ответ 2

У нас была аналогичная проблема, и выяснилось, что IIS7 делает некоторые динамические настройки на основе процессора здесь.

http://www.iis.net/ConfigReference/system.webServer/httpCompression

dynamicCompressionDisableCpuUsage

Дополнительный атрибут uint.

Определяет процент использования ЦП, при котором динамическое сжатие будет отключено.

Примечание. Этот атрибут действует как верхний предел ЦП, при котором динамическое сжатие отключается. Когда загрузка процессора падает ниже значения, указанного в атрибуте dynamicCompressionEnableCpuUsage, динамическое сжатие будет повторно включено.

Значение по умолчанию - 90.


dynamicCompressionEnableCpuUsage

Дополнительный атрибут uint.

Определяет процент использования ЦП, ниже которого будет включено динамическое сжатие. Значение должно быть от 0 до 100. Среднее использование центрального процессора рассчитывается каждые 30 секунд.

Примечание. Этот атрибут действует как нижний предел ЦП, ниже которого включено динамическое сжатие. Когда загрузка ЦП повышается выше значения, указанного в атрибуте dynamicCompressionDisableCpuUsage, динамическое сжатие будет отключено.

Значение по умолчанию - 50.

Обратите внимание на значения по умолчанию - если ваш IIS7 достигает 90% использования ЦП, он отключит весь динамический gzipped-контент до тех пор, пока загрузка процессора не опустится ниже 50%!

Кроме того, некоторые замечательные рекомендации и ориентиры здесь по реальной стоимости процессора GZIP.

http://weblogs.asp.net/owscott/archive/2009/02/22/iis-7-compression-good-bad-how-much.aspx

Короче говоря, если вы регулярно используете динамические страницы размером более 200 кб, это не проблема.

Ответ 3

Следуя отличным советам JohnW, я также включил регистрацию, чтобы найти виновника, хотя причина неудачи оказалась иной:

STATIC_COMPRESSION_NOT_SUCCESS 
Reason 14 
Reason NOT_FREQUENTLY_HIT

Короче говоря, похоже, что если вы не попадаете на страницу достаточно часто, IIS7 не считает это достойным сжатия, что для меня немного странно. Тем не менее, имеет смысл в этом случае, потому что я просто пытался проверить его на локальной машине.

Согласно эта страница, по умолчанию, похоже, что страница должна быть удалена 2 раза в течение 10 секунд, чтобы быть "частым удар". Если вы действительно этого захотите, вы можете переопределить значение по умолчанию в applicationHost.config(% systemroot%\Windows\System32\inetsrv\config). По крайней мере, для меня это заблокированный атрибут, поэтому вы не сможете переопределить его в своем собственном web.config.

<serverRuntime frequentHitThreshold="1" />

Кроме того, теперь я отмечаю, что SO уже получил этот ответ здесь: В IIS7 файлы gzipped не останутся такими.

Ответ 4

В разделе system.webServer вашего файла Web.config добавьте следующие строки:

<remove fileExtension=".js" />  
<mimeMap fileExtension=".js" mimeType="application/x-javascript" />  

Схема сжатия в IIS7 включена по умолчанию, но она отображает только один тип mime javascript для сжатия, application/x-javascript. Добавление строки выше сообщает IIS предоставить все ваши .js файлы, которые имеют тип mime, что в свою очередь делает работу сжатия.

Ответ 5

Я решил проблему, установив динамическое сжатие при добавлении и удалении программ.

Ответ 7

Для меня это оказалось настройкой

noCompressionForProxies

поскольку мы находимся на прокси-сервере здесь... отняли прокси и вуаля, сжатие.