Spec-Zone.ru › Apache HTTP Server

Модуль 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

См. также

  • mod_log_config

Директива 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API