Модуль mod_deflate

Модуль mod_deflate кодирует HTTP-ответ методами gzip и deflate, что позволяет уменьшить размер передаваемых данных в 2 и более раз. mod_deflate представляет из себя собственно модуль и набор патчей для Apache и модуля mod_charset (Russian Apache).

Содержание

Установка
Как это работает
Директивы
DeflateCompLevel
DeflateDisableRange
DeflateEnable
DeflateHTTP
DeflateIdleCheck
DeflateMinIdle
DeflateMinLength
DeflateOrder
DeflateProxied
Что можно записать в лог
Переменные среды
Известные ошибки и особенности
Броузеры, что они умеют

Установка

Дистрибутив необходимо распаковать, перейти в каталог с исходными текстами и выполнить команду ./configure, указав ей путь к исходными текстам Apache. После конфигурирования нужно выполнить команду make:

tar zxf mode_deflate-x.x.x.tar.gz
cd mod_deflate-x.x.x
./configure --with-apache=<apache_dir>
make

Команда make накладывает патчи на исходные тексты Apache и копирует mod_deflate.c в каталог <apache_dir>/src/modules/extra/. На FreeBSD можно указать параметр --with-idle-check для проверки уровня загрузки процессора. При сборке Apache модуль необходимо активировать:

cd <apache_dir>
./configure
    ...
    --activate-module=src/modules/extra/mod_deflate.o
    ...

Как это работает

Для того, чтобы ответ был сжат, в запросе прежде всего должен быть заголовок "Accept-Encoding", в котором указан метод gzip или deflate. На данный момент (2001 год) по обобщённым данным нескольких систем сбора статистики в Рунете около 90-93% всех запросов выполняется броузерами MSIE 5.x и 4.x, понимающими gzip и deflate и около 5-7% - броузерами Netscape 4.x, понимающими gzip.

Кроме того, запрос не должен проходить через транзитные прокси-сервера, поскольку нельзя определённо сказать, умеют ли они корректно кэшировать компрессированые ответы. Например, не умеющий правильно кэшировать сжатые ответы прокси-сервер может передать закэшированный в сжатом виде ответ клиенту, не понимающему подобное кодирование. Наличие прокси-серверов проверяется по заголовку "Via". С этим же связано ограничение на версию протокола HTTP - сжатие выполняется, только если версия запроса не ниже 1.1, так как только в этой версии прокси-сервер обязан устанавливать заголовок "Via". Для запроса версии 1.0 нельзя определённо утверждать, что запрос не проходил через прокси-сервера.

При настройке mod_deflate по умолчанию, ответы на запросы от Netscape 4.x сжиматся не будут, поскольку Netscape делает запросы с версией 1.0. Как уже было сказано, сейчас около 90-93% запросов выполняется броузерами MSIE 4.x и 5.x и около 5-7% - броузером Netscape 4.x. Часть из оставшихся 2-3% запросов могут выполняться броузерами, которые не понимают gzip в качестве "Content-Encoding". Если эти запросы не представляют для вас интереса, то Вы может установить такие директивы

DeflateHTTP    1.0
DeflateProxied on
DeflateOrder   gzip (эта директива не обязательна,
                     так как это её значение по умолчанию)

и получить уменьшение исходящего трафика HTML-файлов в два-три раза, тогда как при настройках по умолчанию уменьшение не так заметно из-за того, что около трети всех запросов выполняется через прокси-сервера.

Существует ещё несколько условий для сжатия ответа:

В сжатых ответах удаляется заголовок "Content-Length", поскольку длина сжатого ответа не известна на момент передачи заголовков. В этом случае при запросе версии HTTP/1.1 Apache передаёт ответ чанками (chunks) и добавляет заголовок "Transfer-Encoding: chunked".

Оба метода кодирования, gzip и deflate, используют один и тот же метод сжатия данных - deflate (RFC 1951), реализуемый библиотекой zlib (RFC 1950). В методе gzip (RFC 1952) перед сжатым потоком добавляется 10-байтный заголовок. Кроме того, после сжатого потока добавляется контрольная сумма CRC32 и длина несжатых данных, в сумме занимающие 8 байт. Тело HTTP-ответа в этом случае такое же, как если бы оно было сжато программой gzip. Это метод понимают броузеры Netscape 4.06-4.08, 4.5-4.7x, MSIE 4.x-5.x, Opera 4.x-5.x. Броузеры Netscape 4.0-4.05 хотя и не передают заголовок "Accept-Encoding", также понимают метод gzip. Netscape 3.0x понимает метод кодирования x-gzip, являющийся полным аналогом метода gzip, однако также не передаёт заголовок "Accept-Encoding". mod_deflate не поддерживает метод x-gzip.

С методом кодирования deflate дела обстоят сложнее. В описании протокола HTTP 1.1 (RFC 2616) deflate описан так:

The "zlib" format defined in RFC 1950 in combination with the "deflate" compression mechanism described in RFC 1951.

Что, по-видимому, должно означать, что перед сжатым потоком должно быть 2 байта заголовка zlib, а после сжатого потока - контрольная сумма Adler32 (4 байта). Однако в броузерах MSIE 4.x-5.x, Opera 4.x-5.x, Netscape 6.0, Mozilla метод deflate реализован иначе - он представляет из себя только сжатый поток без заголовка и контрольной суммы. Именно этот вариант реализован в модуле mod_deflate. Однако известен один броузер, Konqueror, который не понимает метод deflate. Возможно, deflate в нём реализован по RFC 2616, a возможно, просто с с ошибками. Тем не менее, начиная с версии "Konqueror 2.1 post BETA >= 20010128" этот броузер просто не указывает метод deflate в заголовке "Accept-Encoding". Существование двух возможных реализаций и подобных броузеров делает ненадёжным использование метода deflate.

Директивы


Директива DeflateCompLevel

Syntax: DeflateCompLevel 1 .. 9
Default: DeflateCompLevel 1
Context: server config, virtual host, directory, .htaccess

Устанавливает определённый в библиотеке zlib уровень сжатия от 1 до 9. Хотя уровень 1 наименее ресурсоёмок, тем не менее, он, как правило, позволяет уменьшить объём передаваемых файлов HTML в 2-4 раза. Увеличение уровня сжатия до 9 обычно не даёт такого впечатляющего результата, тo есть, если, например, при уровне 1 данные сжимаются в 4 раза, то при уровне 9 они сожмутся лишь в 5 раз. Насколько сжимается тот или иной файл в зависимости от уровня сжатия, Вы можете проверить с помощью программы gzip, указав ей параметр от -1 до -9.

В библиотеке zlib определён ещё один уровень - 0 (store), при котором сжатие не выполняется, но в контексте протокола HTTP он не имеет смысла, поскольку всегда можно передавать данные, вообще не используя сжатие.


Директива DeflateDisableRange

Syntax: DeflateDisableRange строка
Default: нет
Context: server config, virtual host, directory, .htaccess

Задаёт строку, при нахождении которой в заголовке "User-Agent" запрещается передача части ответа (ranges) в случае, если ответ может быть кодирован методом gzip или deflate. Таких директив может быть несколько. Если ответ не может быть кодирован методом gzip или deflate, то части (ranges) для данного броузера не запрещаются. Рекомендуется устанавливать такую директиву

DeflateDisableRange "MSIE 4."

Директива DeflateEnable

Syntax: DeflateEnable on|off
Default: DeflateEnable off
Context: server config, virtual host, directory, .htaccess

Разрешает или запрещает кодирование методом gzip или deflate.


Директива DeflateHTTP

Syntax: DeflateHTTP 1.0|1.1
Default: DeflateHTTP 1.1
Context: server config, virtual host, directory, .htaccess

Устанавливает минимальную версию протокола HTTP в запросе, при которой разрешается кодирование методом gzip или deflate.


Директива DeflateIdleCheck

Syntax: DeflateIdleCheck число
Default: DeflateIdleCheck 1
Context: server config

Задаёт интервал проверки уровня загрузки процессора в секундах. Эта директива доступна только на FreeBSD 3.x и выше при указании параметра --with-idle-check при конфигурации.


Директива DeflateMinIdle

Syntax: DeflateMinIdle 0 .. 100
Default: DeflateMinIdle 0
Context: server config

Задаёт минимальный уровень бездействия процессора в процентах, при котором разрешается кодирование методом gzip или deflate. Эта директива доступна только на FreeBSD 3.x и выше при указании параметра --with-idle-check при конфигурации.


Директива DeflateMinLength

Syntax: DeflateMinLength число
Default: DeflateMinLength 0
Context: server config, virtual host, directory, .htaccess

Устанавливает минимальный размер тела ответа в байтах, при котором разрешается кодирование методом gzip или deflate. Размер определяется из заголовка "Content-Length", если это заголовок отсутствует, то кодирование выполняется независимо от размера ответа.


Директива DeflateOrder

Syntax: DeflateOrder метод [метод]
Default: DeflateOrder gzip
Context: server config, virtual host, directory, .htaccess

Задаёт приоритет при выборе метода кодирования. Например, директива "DeflateOrder deflate gzip" делает метод deflate более приоритетным, чем gzip. Этой же директивой можно устанавливать только один метод кодирования. По умолчанию используется только метод gzip, поскольку использование метода deflate на данный момент ненадёжно.


Директива DeflateProxied

Syntax: DeflateProxied on|off
Default: DeflateProxied off
Context: server config, virtual host, directory, .htaccess

Разрешает или запрещает кодирование методом gzip или deflate для проксированных запросов. Такие запросы определяются по наличию заголовка "Via".


Что можно записать в лог

Судить о том, был ли сжат тот или иной ответ, каким методом и насколько можно с помощью заметок (notes):

В логах заметки можно использовать в виде %{defl_r}n.

Переменные среды

Кодирование тем или иным методом можно запретить с помощью переменных среды "no_deflate" и "no_gzip", устанавливаемых директивами SetEnvIf, BrowserMatch и им подобным, например:

BrowserMatch   "Konqueror"  no_deflate

Известные ошибки и особенности

Броузеры, что они умеют

Ниже приводится список броузеров с указанием версии протокола и методов кодирования, указываемые в заголовке "Accept-Encoding". Для более или менее распространених броузеров в скобках приводиться приблизительный процент их использования.


(C) 2001, Igor Sysoev