Персональный | |
Модуль mod_deflate
15.03.2004 Версия 1.0.21 Модуль mod_deflate кодирует HTTP-ответ методами gzip и deflate, что позволяет уменьшить размер передаваемых данных в 2 и более раз. mod_deflate представляет из себя собственно модуль и набор патчей для Apache и модуля mod_charset (Russian Apache). СодержаниеУстановкаКак это работает Некоторые рекомендации Что можно сжимать Какие бывают методы кодирования Директивы
Переменные среды Ресурсы: память и процессор Известные ошибки и особенности Браузеры, что они умеют Использование заголовка "Vary" Прокси-сервера Установка
Дистрибутив необходимо распаковать, перейти в каталог с исходными текстами
и выполнить команду Командаtar zxf mod_deflate-1.0.21.tar.gz cd mod_deflate-1.0.21 ./configure --with-apache=<apache_dir> make make накладывает патчи на исходные тексты Apache
и копирует mod_deflate.c в каталог
<apache_dir>/src/modules/extra/ .
При сборке Apache модуль необходимо активировать:
cd <apache_dir> ./configure ... --activate-module=src/modules/extra/mod_deflate.o ... Если у Вас не установлена библиотека zlib, то Вы можете скачать дистрибутив и статически её собрать: В этом случае при конфигурировании mod_deflate необходимо указать путь к этой библиотеке:tar zxf zlib-1.1.4.tar.gz cd zlib-1.1.4 ./configure make Параметрcd mod_deflate-1.0.21 ./configure --with-apache=../apache-1.3.22 --with-zlib=../zlib-1.1.4 make --with-zlib появился в mod_deflate версии 1.0.10.
До этого mod_deflate собирался с уже установленной библиотекой zlib.
При конфигурировании можно указать ещё два параметра:
Как это работаетДля того, чтобы ответ был сжат, в запросе прежде всего должен быть заголовок "Accept-Encoding", в котором указан метод gzip или deflate. В середине 2002 года по обобщённым данным нескольких систем сбора статистики в Рунете около 90-93% всех запросов выполняется браузерами MSIE 4.x-6.x, понимающими gzip и deflate и около 5-7% - браузерами Netscape 4.x, понимающими gzip. Кроме того, запрос не должен проходить через транзитные прокси-сервера, поскольку нельзя определённо сказать, умеют ли они корректно кэшировать сжатые ответы. Например, не умеющий правильно кэшировать сжатые ответы прокси-сервер может передать закэшированный в сжатом виде ответ клиенту, непонимающему подобное кодирование. Наличие прокси-серверов проверяется по заголовку "Via". С этим же связано ограничение на версию протокола HTTP - сжатие выполняется, только если версия запроса не ниже 1.1, так как только в этой версии прокси-сервер обязан устанавливать заголовок "Via". Для запроса версии 1.0 нельзя определённо утверждать, что запрос не проходил через прокси-сервера. Существует ещё несколько условий для сжатия ответа:
Некоторые рекомендации
Для того, чтобы ответы кодировались методом gzip достаточно одной директивы
DeflateEnable on.
Кроме того, из-за ошибки в
MSIE 4.x рекомендуется использовать директиву
При такой настройке сжатие будет выполняться только при условиях,
описанных в предыдущем разделе.
Однако ответы на запросы от Netscape 4.x сжиматься
не будут, поскольку Netscape 4.x делает запросы версии 1.0.
Поскольку сейчас около 90-93% запросов выполняется браузерами
MSIE 4.x-6.x и около 5-7% - браузером Netscape 4.x,
то часть из оставшихся 2-3% запросов может выполняться браузерами,
которые не понимают gzip в качестве и получить уменьшение исходящего трафика HTML-файлов в два-три раза, тогда как при настройках по умолчанию уменьшение не так заметно из-за того, что около трети всех запросов выполняется через прокси-сервера. Однако нужно заметить, что MSIE 5.5 и выше, работающие через прокси-сервер, как правило, не воспринимают сжатые запросы.DeflateHTTP 1.0 DeflateProxied on Кроме того, можно воспользоваться параметрами "nocachable" и "poor_cachable" директивы DeflateProxied, позволяющими сжимать ответы, для которых кэширование запрещено, или же прокси-сервера вряд ли будут их кэшировать. Если же Вы всё же решили не сжимать запросы, проходящие через прокси-сервера, то можно разрешить сжатие для запросов версии 1.0: поскольку вероятность того, что прокси-сервер не укажет заголовок "Via" достаточно мала.DeflateHTTP 1.0 Директива DeflateVary on позволяет управлять кэшированием при прохождении ответа через прокси-сервера, по крайней мере, для самого распространённого из них Squid. Однако в этом случае ранние версии MSIE будут кэшировать не все ответы. Подробнее об этом в разделе "Использование заголовка "Vary"". С помощью директивы DeflateTypes можно разрешить кодирование для ответов с типом "text/plain". Если Вы разрешили кодирование для запросов версии 1.0, то не следует разрешать сжатие для типов "text/css" и "application/x-javascript", поскольку Netscape 4.x не понимает сжатые файлы этих типов. Не рекомендуется использовать метод deflate по причинам, изложенным чуть ниже. При возникновении проблем с тем или иным браузером, декларирующим понимание какого-либо метода, но непонимающим его на самом деле, в качестве временного решения рекомендуется использовать запрещающие переменные среды. Что можно сжиматьНиже перечислены некоторые типы, которые можно достаточно безопасно кодировать методом gzip или deflate:
Какие бывают методы кодирования
В описании протокола HTTP 1.1 (RFC 2616) описаны 4 метода кодирования -
gzip, deflate, compress и identity.
В описании протокола
ДирективыДиректива DeflateCompLevelsyntax: DeflateCompLevel 1 .. 9default: DeflateCompLevel 1 context: server config, virtual host, directory, .htaccess
Устанавливает определённый в библиотеке zlib уровень сжатия от 1 до 9.
Хотя уровень 1 наименее ресурсоёмок, тем не менее, он, как правило, позволяет
уменьшить объём передаваемых файлов HTML в 2-4 раза.
Увеличение уровня сжатия до 9 обычно не даёт такого впечатляющего результата,
тo есть, если, например, при уровне 1 данные сжимаются в 4 раза,
то при уровне 9 они сожмутся лишь в 5 раз.
Насколько сжимается тот или иной файл в зависимости от уровня сжатия,
Вы можете проверить с помощью программы В библиотеке zlib определён ещё один уровень - 0 (store), при котором сжатие не выполняется, но в контексте протокола HTTP он не имеет смысла, поскольку всегда можно передавать данные, вообще не используя сжатие. Директива DeflateDisableRangesyntax: DeflateDisableRange строка [строка ...]default: нет context: server config, virtual host, directory, .htaccess compatibility: mod_deflate 1.0.4 и выше Задаёт строку, при нахождении которой в заголовке "User-Agent" запрещается передача части ответа (range) в случае, если ответ может быть кодирован методом gzip или deflate. Таких директив может быть несколько. Если ответ не может быть кодирован методом gzip или deflate, то части (range) для данного браузера не запрещаются. До версии 1.0.8 в одной директиве можно указывать только одну строку. Рекомендуется устанавливать такую директиву DeflateDisableRange "MSIE 4." Директива DeflateEnablesyntax: DeflateEnable on|offdefault: DeflateEnable off context: server config, virtual host, directory, .htaccess Разрешает или запрещает кодирование методом gzip или deflate. Директива DeflateHTTPsyntax: DeflateHTTP 1.0|1.1default: DeflateHTTP 1.1 context: server config, virtual host, directory, .htaccess Устанавливает минимальную версию протокола HTTP в запросе, при которой разрешается кодирование методом gzip или deflate. Директива DeflateHashsyntax: DeflateHash 1|2|4|8|16|32|64|128default: DeflateHash 64 context: server config, virtual host, directory, .htaccess compatibility: mod_deflate 1.0.17 и выше Устанавливает размер хэшей в килобайтах, используемых при сжатии. Больший размер улучшает сжатие, однако увеличивает потребность в памяти. Подробнее об этом в разделе "Ресурсы: память и процессор". Эта директива задаёт параметр memLevel функции deflateInit2() библиотеки zlib. Значение 128K соответствует memLevel, равному 9, 64K - 8 и т.д.
До версии 1.0.17 размер хэшей равен 128K, однако, начиная с версии 1.0.17,
по умолчанию используется размер 64K. Такой же размер использует
программа Директива DeflateIdleChecksyntax: DeflateIdleCheck числоdefault: DeflateIdleCheck 1 context: server config Задаёт интервал проверки уровня загрузки процессора в секундах. Эта директива доступна только на FreeBSD 3.x и выше при указании параметра --with-idle-check при конфигурации. Директива DeflateIgnoreFlushsyntax: DeflateIgnoreFlush on|offdefault: DeflateIgnoreFlush off context: server config, virtual host, directory, .htaccess compatibility: mod_deflate 1.0.15 и выше Разрешает или запрещает игнорирование вызовов ap_bflush(). Игнорирование этих вызовов позволяет существенно улучшить сжатие ответов, выдаваемых, например, Chili!Soft ASP, который после каждого вывода даже нескольких байт вызывает ap_bflush(). Директива DeflateMaxProcessessyntax: DeflateMaxProcesses числоdefault: DeflateMaxProcesses 0 context: server config compatibility: mod_deflate 1.0.13 и выше Задаёт максимальное число дочерних процессов Apache, при котором разрешается кодирование методом gzip или deflate. Дело в том, что библиотека zlib использует почти 250-400K памяти (подробнее об этом в разделе "Ресурсы: память и процессор"). Если процесс Apache, не сжимающий ответ, занимает около 500K физической памяти, то на компьютере с 512M памяти можно запустить около 900 процессов Apache. При большем количестве возможно начнётся активный свопинг. Однако, если часть процессов Apache сжимает ответ, то 512M уже не хватит для 900 процессов и свопинг начнётся раньше. Если нагрузка на сервер такова, что обычно с ней справляются 500 процессов Apache, то можно поставить ограничение на сжатие до 700 процессов. В этом случае при пиковых нагрузках, требующих для обработки 700-900 процессов, сжатия не будет. Ноль означает неограниченное число процессов. Директива DeflateMinIdlesyntax: DeflateMinIdle 0 .. 100default: DeflateMinIdle 0 context: server config Задаёт минимальный уровень бездействия процессора в процентах, при котором разрешается кодирование методом gzip или deflate. Эта директива доступна только на FreeBSD 3.x и выше при указании параметра --with-idle-check при конфигурации. Директива DeflateMinLengthsyntax: DeflateMinLength числоdefault: DeflateMinLength 0 context: server config, virtual host, directory, .htaccess Устанавливает минимальный размер тела ответа в байтах, при котором разрешается кодирование методом gzip или deflate. Размер определяется из заголовка "Content-Length", если это заголовок отсутствует, то кодирование выполняется независимо от размера ответа. Директива DeflateOrdersyntax: DeflateOrder метод [метод]default: DeflateOrder gzip context: server config, virtual host, directory, .htaccess
Задаёт приоритет при выборе метода кодирования.
Например, директива Директива DeflateProxiedsyntax: DeflateProxied on|poor_cachable|nocachable|offdefault: DeflateProxied off context: server config, virtual host, directory, .htaccess Разрешает или запрещает кодирование ответов методом gzip или deflate для проксированных запросов. Такие запросы определяются по наличию заголовка "Via". Начиная с версии 1.0.16, с помощью параметров "nocachable" и "poor_cachable" можно более гибко настраивать сжатие ответов для проксированных запросов в зависимости от кэшируемости ответов. Параметр "nocachable" разрешает сжатие ответа в случае, если ответ содержит заголовки, запрещающие кэширование. mod_deflate к таким относит заголовок "Expires", в котором указано прошедшее время, и заголовок "Cache-Control" со значением "no-cache". Эти заголовки традиционно используются для запрета кэширования и должны пониматься всеми прокси-серверами, претендующими на корректную работу. Параметр "poor_cachable" разрешает сжатие не только для описанных выше некэшируемых ответов, но и для так называемых плохо кэшируемых ответов. К ним mod_deflate относит ответы с заголовком "Cache-Control" и значениями "no-store" и "private", которые могут не поддерживаться некоторыми прокси-серверами. Кроме того, плохо кэшируемыми ответами считаются ответы, не содержащие заголовки "Expires", "Cache-Control", "Last-Modified" и "ETag". Такие ответы, как правило, не кэшируются прокси-серверами. Необходимо заметить, что инструкции вида <meta http-equiv="pragma" content="no-cache"> внутри HTML документа никак не влияют на mod_deflate. Директива DeflateTypessyntax: DeflateTypes [+|-]mime-type [[+|-]mime-type ...]default: DeflateTypes text/html context: server config, virtual host, directory, .htaccess compatibility: mod_deflate 1.0.8 и выше Задаёт типы ответов, которые можно кодировать методом gzip или deflate. Символы "+" и "-" позволяют разрешать или запрещать типы ответов при наследовании конфигурации из предыдущей секции. Символ "+" использовать не обязательно. Запретить кодирование для ответов с типом "text/html" нельзя. Тип ответа должен быть указан точно, то есть, маски вида "text/*" не допускаются. До версии 1.0.8 mod_deflate кодирует только ответы с типом "text/*". Директива DeflateVarysyntax: DeflateVary on|offdefault: DeflateVary off context: server config, virtual host, directory, .htaccess compatibility: mod_deflate 1.0.13 и выше Разрешает или запрещает выдачу заголовка "Vary: Accept-Encoding" в ответах, сжатых методом gzip или deflate. Директива DeflateWindowsyntax: DeflateWindow 1|2|4|8|16|32default: DeflateWindow 32 context: server config, virtual host, directory, .htaccess compatibility: mod_deflate 1.0.17 и выше Устанавливает размер окна в килобайтах, используемого при сжатии. Больший размер улучшает сжатие, однако увеличивает потребность в памяти. Подробнее об этом в разделе "Ресурсы: память и процессор". Если в ответе есть заголовок "Content-Length" и указанный в нём размер меньше заданного окна, то окно уменьшается до минимально возможного так, чтобы размер ответа не превышала размер окна минус 262 байта. Кроме того, во столько же раз уменьшается и размер хэшей, заданный директивой DeflateHash. До версии 1.0.17 mod_deflate использует окно размером 32K. Что можно записать в логСудить о том, был ли сжат тот или иной ответ, каким методом и насколько, можно с помощью заметок (notes):
В логах заметки можно использовать в виде %{defl_r}n. Рекомендуется следующий вариант: \"%{defl_m}n:%{defl_r}n\" Переменные среды
Кодирование тем или иным методом можно запретить с помощью переменных
среды "no_deflate" и "no_gzip", устанавливаемых директивами
На самом деле, указывать именно эти строки не нужно, так как, начиная с версии 1.0.7, mod_deflate содержит их в коде.BrowserMatch "Konqueror" no_deflate BrowserMatch "rv:0.9.1) Gecko/" no_gzip no_deflate Ресурсы: память и процессорПамять является критическим ресурсом в том случае, если необходимо использовать сотни процессов Apache. Apache без тяжёлых модулей типа mod_perl или php обычно требует около 200-300K физической памяти на каждый дочерний процесс. Так как zlib использует сравнимое количество памяти, то сжатие удваивает требования к общему количеству памяти. Размер используемой zlib памяти зависит от двух параметров и вычисляется по следующей формуле: Для версии 1.0.17 этот размер не регулировался и был равен 4 * 32K + 2 * 128K, то есть, 384K. Начиная с версии 1.0.17, по умолчанию используется память размером 4 * 32K + 2 * 64K, то есть, 256K. Естественно, меньший размер окна и хэшей ухудшают степень сжатия, однако, если используются небольшие уровни сжатия, то ухудшение незаметно.4 * DeflateWindow + 2 * DeflateHash Ещё один способ регулирования расхода памяти предоставляет директива DeflateMaxProcesses. На FreeBSD 3.x и выше можно задавать минимальный уровень бездействия процессора в процентах, при котором разрешается кодирование методом gzip или deflate, однако практика показывает, что современные процессоры сжимают достаточно быстро (по крайней мере файлы до 100K) и особенной необходимости в этом ограничении нет. Известные ошибки и особенности
Браузеры, что они умеют
Ниже приводится список браузеров с указанием версии протокола
и методов кодирования, указываемые в заголовке
Использование заголовка "Vary"MSIE обрабатывает заголовок "Vary" достаточно своеобразно:
Прокси-сервераОколо трети всех запросов выполняются через прокси-сервера. Ниже приводится список некоторых прокси-серверов. Для более или менее распространённых серверов в скобках указан приблизительный процент их использования на данный момент (2001 год).
(C) Игорь Сысоев |