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>

Директива DeflateAlterETag

Описание: Как изменять исходящий заголовок ETag во время сжатия
Синтаксис:
DeflateAlterETag AddSuffix|NoChange|Remove
Значение по умолчанию:
DeflateAlterETag AddSuffix
Контекст: конфигурация сервера, виртуальный хост
Статус: Расширение
Модуль: mod_deflate
Совместимость: Доступна в Apache 2.4.58 и более поздних версиях

Директива DeflateAlterETag задает способ изменения заголовка ETag при сжатии ответа.

AddSuffix

Добавляет метод сжатия в конец значения ETag, благодаря чему сжатое и несжатое представления получают уникальные значения ETag. Это значение используется по умолчанию начиная с версии 2.4.0, но оно препятствует отправке ответов «HTTP Not Modified» (304) на условные запросы сжатого содержимого.

NoChange

Не изменяет ETag сжатого ответа. До версии 2.4.0 это значение использовалось по умолчанию, но оно не соответствует требованию HTTP/1.1 о том, что все представления одного ресурса должны иметь уникальные значения ETag.

Remove

Удаляет заголовок ETag из сжатых ответов. Это может сделать невозможными некоторые условные запросы, но позволяет избежать недостатков предыдущих вариантов.

Директива DeflateBufferSize

Описание: Размер фрагмента, сжимаемого zlib за один раз
Синтаксис:
DeflateBufferSize value
Значение по умолчанию:
DeflateBufferSize 8096
Контекст: конфигурация сервера, виртуальный хост
Статус: Расширение
Модуль: mod_deflate

Директива DeflateBufferSize задает размер в байтах фрагментов, которые zlib должен сжимать за один раз. Если размер сжатого ответа превышает значение, заданное этой директивой, httpd переключается на передачу с блочным кодированием (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

Описание: Максимальный коэффициент распаковки для тел запросов
Синтаксис:
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