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