Модуль Apache mod_deflate
| Описание: | Сжатие содержимого перед отправкой клиенту |
|---|---|
| Статус: | Расширение |
| Идентификатор модуля: | deflate_module |
| Файл исходного кода: | mod_deflate.c |
Краткое описание
Модуль mod_deflate предоставляет фильтр вывода DEFLATE, который позволяет сжимать данные, отправляемые сервером клиенту по сети, перед их отправкой.
Поддерживаемые кодировки
Поддерживается только кодировка gzip, чтобы обеспечить полную совместимость со старыми браузерами. Кодировка deflate не поддерживается, пожалуйста, ознакомьтесь с документацией zlib для получения полной информации.
Примеры конфигураций
Сжатие и TLS
Некоторые веб-приложения уязвимы к атакам раскрытия информации, когда соединение TLS передает данные, сжатые алгоритмом deflate. Для получения дополнительной информации ознакомьтесь с подробностями атак семейства «BREACH».
Это простая конфигурация, которая сжимает распространённые текстовые типы содержимого.
Сжать только несколько типов
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
Включение сжатия
Сжатие и TLS
Некоторые веб-приложения уязвимы к атакам раскрытия информации, когда соединение TLS передает данные, сжатые алгоритмом deflate. Для получения дополнительной информации ознакомьтесь с подробностями атак семейства «BREACH».
Сжатие вывода
Сжатие реализовано фильтром DEFLATE фильтр. Следующая директива включит сжатие для документов в контейнере, где она размещена:
SetOutputFilter DEFLATE SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png)$" no-gzip
Если вы хотите ограничить сжатие определёнными MIME-типами, вы можете использовать директиву AddOutputFilterByType. Вот пример включения сжатия только для HTML-файлов документации Apache:
<Directory "/your-server-root/manual">
AddOutputFilterByType DEFLATE text/html
</Directory> Примечание
ФильтрDEFLATE всегда вставляется после фильтров RESOURCE, таких как PHP или SSI. Он никогда не обрабатывает внутренние подзапросы.Примечание
Существует переменная окруженияforce-gzip, установленная через SetEnv, которая проигнорирует настройку accept-encoding вашего браузера и отправит сжатый вывод.Распаковка вывода
Модуль mod_deflate также предоставляет фильтр для распаковки/рассжатия gzip-сжатого тела ответа. Для активации этой функции необходимо вставить фильтр INFLATE в цепочку фильтров вывода, используя SetOutputFilter или AddOutputFilter, например:
<Location "/dav-area">
ProxyPass "http://example.com/"
SetOutputFilter INFLATE
</Location> Этот пример распакует gzip-сжатый вывод с example.com, чтобы другие фильтры могли выполнить дальнейшую обработку.
Распаковка ввода
Модуль mod_deflate также предоставляет фильтр для распаковки тела запроса, сжатого gzip. Для активации этой функции необходимо вставить фильтр DEFLATE в цепочку фильтров ввода, используя SetInputFilter или AddInputFilter, например:
<Location "/dav-area">
SetInputFilter DEFLATE
</Location> Теперь, если запрос содержит заголовок Content-Encoding: gzip, тело будет автоматически распаковано. Несколько браузеров способны сжимать тела запросов gzip. Однако некоторые специальные приложения фактически поддерживают сжатие запросов, например, некоторые клиенты WebDAV.
Примечание о Content-Length
Если вы сами обрабатываете тело запроса, не доверяйте заголовку Content-Length! Заголовок Content-Length отражает длину поступающих данных от клиента, а не количество байтов в потоке распакованных данных.
Работа с прокси-серверами
Модуль mod_deflate отправляет заголовок HTTP ответа Vary: Accept-Encoding для уведомления прокси-серверов о том, что кэшированный ответ должен быть отправлен только клиентам, которые отправляют соответствующий заголовок запроса Accept-Encoding. Это предотвращает отправку сжатого содержимого клиентам, которые его не поймут.
Если вы используете специальные исключения, зависящие, например, от заголовка User-Agent, вы должны вручную настроить добавление к заголовку Vary для уведомления прокси-серверов об дополнительных ограничениях. Например, в типичной конфигурации, где добавление фильтра DEFLATE зависит от User-Agent, вы должны добавить:
Header append Vary User-Agent
Если ваше решение о сжатии зависит от другой информации, кроме заголовков запросов (например, версии HTTP), вам необходимо установить заголовок Vary в значение *. Это предотвращает кэширование полностью совместимыми прокси-серверами.
Пример
Header set Vary *
Обработка предварительно сжатого содержимого
Поскольку mod_deflate пересжимает содержимое каждый раз при поступлении запроса, можно получить выгоду от предварительного сжатия содержимого и указания mod_deflate на предоставление этих данных без пересжатия. Это можно сделать с помощью следующей конфигурации:
<IfModule mod_headers.c>
# Serve gzip compressed CSS and JS files if they exist
# and the client accepts gzip.
RewriteCond "%{HTTP:Accept-encoding}" "gzip"
RewriteCond "%{REQUEST_FILENAME}\.gz" -s
RewriteRule "^(.*)\.(css|js)" "$1\.$2\.gz" [QSA]
# Serve correct content types, and prevent mod_deflate double gzip.
RewriteRule "\.css\.gz$" "-" [T=text/css,E=no-gzip:1]
RewriteRule "\.js\.gz$" "-" [T=text/javascript,E=no-gzip:1]
<FilesMatch "(\.js\.gz|\.css\.gz)$">
# Serve correct encoding type.
Header append Content-Encoding gzip
# Force proxies to cache gzipped &
# non-gzipped css/js files separately.
Header append Vary Accept-Encoding
</FilesMatch>
</IfModule> Директива DeflateBufferSize
| Описание: | Размер фрагмента, который zlib сжимает за один раз |
|---|---|
| Синтаксис: | DeflateBufferSize value |
| По умолчанию: | DeflateBufferSize 8096 |
| Контекст: | конфигурация сервера, виртуальный хост |
| Статус: | Расширение |
| Модуль: | mod_deflate |
Директива DeflateBufferSize определяет размер фрагментов в байтах, которые zlib должен сжимать за один раз. Если размер сжатого ответа больше, чем указанный в этой директиве, httpd переключится на кодировку chunked (заголовок HTTP Transfer-Encoding установлен на Chunked). Это имеет побочный эффект - не устанавливается заголовок HTTP Content-Length. Это особенно важно, когда httpd работает за обратным кеширующим прокси или когда httpd настроен с mod_cache и mod_cache_disk, потому что HTTP-ответы без заголовка Content-Length могут не кэшироваться.
Директива DeflateCompressionLevel
| Описание: | Уровень сжатия вывода |
|---|---|
| Синтаксис: | DeflateCompressionLevel value |
| По умолчанию: | Zlib's default |
| Контекст: | конфигурация сервера, виртуальный хост |
| Статус: | Расширение |
| Модуль: | mod_deflate |
Директива DeflateCompressionLevel определяет уровень сжатия, который необходимо использовать. Чем выше значение, тем лучше сжатие, но тем больше требуется времени ЦП для его достижения.
Значение должно быть от 1 (меньшее сжатие) до 9 (большее сжатие).
Директива DeflateFilterNote
| Описание: | Выводит коэффициент сжатия в заметку для ведения логов |
|---|---|
| Синтаксис: | DeflateFilterNote [type] notename |
| Контекст: | конфигурация сервера, виртуальный хост |
| Статус: | Расширение |
| Модуль: | mod_deflate |
Директива DeflateFilterNote указывает, что к запросу должна быть добавлена заметка о коэффициентах сжатия. Имя заметки соответствует значению, заданному для директивы. Вы можете использовать эту заметку для статистических целей, добавив её значение в свой лог доступа.
Пример
DeflateFilterNote ratio
LogFormat '"%r" %b (%{ratio}n) "%{User-agent}i"' deflate
CustomLog "logs/deflate_log" deflate Для получения более точных значений из логов, вы можете использовать аргумент type для указания типа данных, которые нужно добавить в заметку для ведения логов. type может быть одним из:
Input- Сохранить в заметке количество байт входного потока фильтра.
Output- Сохранить в заметке количество байт выходного потока фильтра.
Ratio- Сохранить коэффициент сжатия (
output/input * 100) в заметке. Это значение по умолчанию, если аргумент type опущен.
Таким образом, вы можете вести логи следующим образом:
Точное ведение логов
DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio
LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
CustomLog "logs/deflate_log" deflate См. также
Директива DeflateInflateLimitRequestBody
| Описание: | Максимальный размер распакованных тел запросов |
|---|---|
| Синтаксис: | DeflateInflateLimitRequestBody value |
| По умолчанию: | None, but LimitRequestBody applies after deflation |
| Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
| Статус: | Расширение |
| Модуль: | mod_deflate |
| Совместимость: | 2.4.10 и более поздние версии |
Директива DeflateInflateLimitRequestBody задаёт максимальный размер распакованного тела запроса. Если она не установлена, к распакованному телу применяется LimitRequestBody.
Директива DeflateInflateRatioBurst
| Описание: | Максимальное количество превышений коэффициента распаковки для тел запросов |
|---|---|
| Синтаксис: | DeflateInflateRatioBurst value |
| По умолчанию: | DeflateInflateRatioBurst 3 |
| Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
| Статус: | Расширение |
| Модуль: | mod_deflate |
| Совместимость: | 2.4.10 и более поздние версии |
Директива DeflateInflateRatioBurst задаёт максимальное количество превышений коэффициента распаковки для тела запроса перед прерыванием запроса.
Директива DeflateInflateRatioLimit
| Описание: | Максимальный коэффициент распаковки для тел запросов |
|---|---|
| Синтаксис: | DeflateInflateRatioLimit value |
| По умолчанию: | DeflateInflateRatioLimit 200 |
| Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
| Статус: | Расширение |
| Модуль: | mod_deflate |
| Совместимость: | 2.4.10 и более поздние версии |
Директива DeflateInflateRatioLimit задаёт максимальный коэффициент отношения размера сжатого к распакованному телу запроса. Этот коэффициент проверяется по мере поступления тела, и если он превышен более чем DeflateInflateRatioBurst раз, запрос будет прерван.
Директива DeflateMemLevel
| Описание: | Сколько памяти должно использовать zlib для сжатия |
|---|---|
| Синтаксис: | DeflateMemLevel value |
| По умолчанию: | DeflateMemLevel 9 |
| Контекст: | настройка сервера, виртуальный хост |
| Статус: | Расширение |
| Модуль: | mod_deflate |
Директива DeflateMemLevel задаёт, сколько памяти должно использовать zlib для сжатия (значение от 1 до 9).
Директива DeflateWindowSize
| Описание: | Размер окна сжатия Zlib |
|---|---|
| Синтаксис: | DeflateWindowSize value |
| По умолчанию: | DeflateWindowSize 15 |
| Контекст: | настройка сервера, виртуальный хост |
| Статус: | Расширение |
| Модуль: | mod_deflate |
Директива DeflateWindowSize задаёт размер окна сжатия zlib (значение от 1 до 15). Как правило, чем больше размер окна, тем выше ожидаемая степень сжатия.
© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/mod/mod_deflate.html