Spec-Zone.ru › Apache HTTP Server

Модуль Apache mod_brotli

Описание: Сжимает содержимое с помощью Brotli перед отправкой клиенту
Статус: Расширение
Идентификатор модуля: brotli_module
Исходный файл: mod_brotli.c
Совместимость: Доступен начиная с версии 2.4.26.

Краткое описание

Модуль mod_brotli предоставляет выходной фильтр BROTLI_COMPRESS, который позволяет сжимать вывод сервера в формате сжатия brotli перед отправкой клиенту по сети. Этот модуль использует библиотеку Brotli, доступную по адресу https://github.com/google/brotli.

Примеры конфигурации

Сжатие и TLS

Некоторые веб-приложения уязвимы к атаке, направленной на раскрытие информации, если через TLS-соединение передаются сжатые данные. Дополнительные сведения см. в описании группы атак «BREACH».

Это простая конфигурация, которая сжимает распространённые типы текстового содержимого.

Сжатие только нескольких типов

AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/xml text/css text/javascript application/javascript

Включение сжатия

Сжатие и TLS

Некоторые веб-приложения уязвимы к атаке, направленной на раскрытие информации, если через TLS-соединение передаются сжатые данные. Дополнительные сведения см. в описании группы атак «BREACH».

Сжатие вывода

Сжатие реализовано фильтром BROTLI_COMPRESS фильтра. Следующая директива включает сжатие документов в контейнере, в котором она размещена:

SetOutputFilter BROTLI_COMPRESS
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-brotli

Если требуется ограничить сжатие определёнными типами MIME в целом, можно использовать директиву AddOutputFilterByType. Ниже приведён пример включения сжатия только для HTML-файлов документации Apache:

<Directory "/your-server-root/manual">
    AddOutputFilterByType BROTLI_COMPRESS text/html
</Directory>

Примечание

Фильтр BROTLI_COMPRESS всегда вставляется после фильтров RESOURCE, таких как PHP или SSI. Он никогда не обрабатывает внутренние подзапросы.

Примечание

Существует переменная окружения no-brotli, задаваемая с помощью SetEnv, которая отключает сжатие brotli для конкретного запроса, даже если клиент его поддерживает.

Работа с прокси-серверами

Модуль mod_brotli отправляет заголовок ответа HTTP Vary: Accept-Encoding, уведомляя прокси-серверы о том, что кэшированный ответ следует отправлять только клиентам, которые передают соответствующий заголовок запроса Accept-Encoding. Это предотвращает отправку сжатого содержимого клиенту, который не сможет его обработать.

Если используются особые исключения, зависящие, например, от заголовка User-Agent, необходимо вручную добавить соответствующее значение в заголовок Vary, чтобы уведомить прокси-серверы о дополнительных ограничениях. Например, в типичной конфигурации, где добавление фильтра BROTLI_COMPRESS зависит от User-Agent, следует добавить:

Header append Vary User-Agent

Если решение о сжатии зависит от информации, отличной от заголовков запроса (например, от версии HTTP), необходимо установить для заголовка Vary значение *. Это полностью исключает кэширование совместимыми прокси-серверами.

Пример

Header set Vary *

Передача предварительно сжатого содержимого

Поскольку mod_brotli повторно сжимает содержимое при каждом запросе, можно повысить производительность, предварительно сжав содержимое и указав mod_brotli передавать его без повторного сжатия. Это можно сделать с помощью следующей конфигурации:

<IfModule mod_headers.c>
    # Serve brotli compressed CSS files if they exist
    # and the client accepts brotli.
    RewriteCond "%{HTTP:Accept-encoding}" "br"
    RewriteCond "%{REQUEST_FILENAME}\.br" "-s"
    RewriteRule "^(.*)\.css"              "$1\.css\.br" [QSA]

    # Serve brotli compressed JS files if they exist
    # and the client accepts brotli.
    RewriteCond "%{HTTP:Accept-encoding}" "br"
    RewriteCond "%{REQUEST_FILENAME}\.br" "-s"
    RewriteRule "^(.*)\.js"               "$1\.js\.br" [QSA]


    # Serve correct content types, and prevent double compression.
    RewriteRule "\.css\.br$" "-" [T=text/css,E=no-brotli:1]
    RewriteRule "\.js\.br$"  "-" [T=text/javascript,E=no-brotli:1]


    <FilesMatch "(\.js\.br|\.css\.br)$">
      # Serve correct encoding type.
      Header append Content-Encoding br

      # Force proxies to cache brotli &
      # non-brotli css/js files separately.
      Header append Vary Accept-Encoding
    </FilesMatch>
</IfModule>

Директива BrotliAlterETag

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

Директива BrotliAlterETag указывает, как следует изменять заголовок ETag при сжатии ответа.

AddSuffix

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

NoChange

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

Remove

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

Директива BrotliCompressionMaxInputBlock

Описание: Максимальный размер входного блока
Синтаксис:
BrotliCompressionMaxInputBlock value
Значение по умолчанию: (automatic)
Контекст: конфигурация сервера, виртуальный хост
Статус: Расширение
Модуль: mod_brotli

Директива BrotliCompressionMaxInputBlock задаёт максимальный размер входного блока от 16 до 24; следует учитывать, что для больших размеров блока требуется больше памяти.

Директива BrotliCompressionQuality

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

Директива BrotliCompressionQuality задаёт качество сжатия (значение от 0 до 11). Более высокие значения обеспечивают лучшее, но более медленное сжатие.

Директива BrotliCompressionWindow

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

Директива BrotliCompressionWindow задаёт размер скользящего окна сжатия brotli (значение от 10 до 24). Больший размер окна может повысить качество сжатия, но требует больше памяти.

Директива BrotliFilterNote

Описание: Сохраняет коэффициент сжатия в примечании для журналирования
Синтаксис:
BrotliFilterNote [type] notename
Контекст: конфигурация сервера, виртуальный хост
Статус: Расширение
Модуль: mod_brotli

Директива BrotliFilterNote указывает, что к запросу следует добавить примечание о коэффициенте сжатия. Имя примечания задаётся значением директивы. Это примечание можно использовать для статистики, добавив его значение в журнал доступа.

Пример

BrotliFilterNote ratio

LogFormat '"%r" %b (%{ratio}n) "%{User-agent}i"' brotli
CustomLog "logs/brotli_log" brotli

Чтобы извлекать из журналов более точные значения, можно использовать аргумент type, задающий тип данных, сохраняемых в примечании для журналирования. Аргумент type может принимать одно из следующих значений:

Input
Сохраняет в примечании количество байтов во входном потоке фильтра.
Output
Сохраняет в примечании количество байтов в выходном потоке фильтра.
Ratio
Сохраняет в примечании коэффициент сжатия (output/input * 100). Это значение используется по умолчанию, если аргумент type не указан.

Таким образом, его можно добавить в журнал следующим образом:

Точное журналирование

BrotliFilterNote Input instream
BrotliFilterNote Output outstream
BrotliFilterNote Ratio ratio

LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' brotli
CustomLog "logs/brotli_log" brotli

См. также

  • mod_log_config

© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/mod/mod_brotli.html

Spec-Zone.ru

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