Окончательные выводы
Собственно, графики говорят сами за себя. Если у вас HTML-файлы в среднем больше 4 Кб, то появится ощутимый выигрыш для большинства пользователей при включенном gzip на сервере (даже если этот сервер находится на весьма «слабенькой» машине). В случае маленьких файлов и(ли) медленного в вычислениях сервера, стоящего, однако, на быстром канале, будет экономичнее не сжимать файлы.
Хочется также обратить внимание на то, что, отдав пользователю данные быстрее (через gzip-сжатие), мы тем самым освободим часть серверных ресурсов, что может оказаться существенным подспорьем для высоконагруженных проектов.
В общем случае gzip-сжатие позволяет существенно ускорить доставку HTML-файла пользователю, не увеличивая нагрузку на сервер. Если же использовать статическое архивирование (готовые архивы хранить на сервере и обновлять только в случае необходимости), то выгода просто очевидна.
Конфигурируем Apache 1.3
Давайте рассмотрим, как можно настроить некоторые серверы для выдачи текстового содержания в виде архивов. Ниже приведен участок конфигурационного кода для Apache 1.3, позволяющий подключить gzip-сжатие. Основные директивы даны с комментариями.
<IfModule mod_gzip.c>
# включаем gzip
mod_gzip_on Yes
# если рядом с запрашиваемым файлом есть сжатая версия с расширением .gz, то
# будет отдана именно она, ресурсы CPU расходоваться не будут
mod_gzip_can_negotiate Yes
# используем при статическом архивировании расширение .gz
mod_gzip_static_suffix .gz
# выставляем заголовок Content-Encoding: gzip
AddEncoding gzip .gz
# выставляем минимальный размер для сжимаемого файла
mod_gzip_minimum_file_size 1000
# и максимальный размер файла
mod_gzip_maximum_file_size 500000
# выставляем максимальный размер файла, сжимаемого прямо в памяти
mod_gzip_maximum_inmem_size 60000
# устанавливаем версию протокола, с которой будут отдаваться gzip-файлы
# на клиент
mod_gzip_min_http 1000
# исключаем известные проблемные случаи
mod_gzip_item_exclude reqheader "User-agent: Mozilla/4.0[678]"
# устанавливаем сжатие по умолчанию для файлов .html
mod_gzip_item_include file \.html$
# исключаем .css / .js файлы (о них подробнее в следующем разделе)
mod_gzip_item_exclude file \.js$
mod_gzip_item_exclude file \.css$
# дополнительно сжимаем другие текстовые файлы
mod_gzip_item_include mime ^text/html$
mod_gzip_item_include mime ^text/plain$
mod_gzip_item_include mime ^httpd/unix-directory$
# отключаем сжатие для картинок (не дает никакого эффекта)
mod_gzip_item_exclude mime ^image/
# отключаем 'Transfer-encoding: chunked' для gzip-файлов, чтобы
# страница уходила на клиент одним куском
mod_gzip_dechunk Yes
# добавляем заголовок Vary для корректного распознавания браузеров,
# находящихся за локальными прокси-серверами
mod_gzip_send_vary On
</IfModule>
Конфигурируем Apache 2
Для Apache 2 описанные действия выглядят гораздо проще.
# добавляем Content-Type для всех файлов с расширением .gz
AddEncoding gzip .gz
# включаем сжатие для HTML- и XML-файлов
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
# и для иконок (об этом чуть ниже)
AddOutputFilterByType DEFLATE image/x-icon
# выставляем максимальную степень сжатия (если возникнут проблемы с
# серверной производительностью, следует уменьшить до 7 или 1)
DeflateCompressionLevel 9
# и максимальный размер окна для архивирования
DeflateWindowSize 15
# отключаем архивирование для «проблемных» браузеров
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html