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