Модуль 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 См. также
Директива 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