Модуль 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