<-
Apache > HTTP 服务器 > 文档 > 版本 2.4 > 模块

Apache 模块 mod_brotli

可用语言:  en  |  fr 

描述在内容传递给客户端之前,使用 Brotli 压缩内容
状态扩展
模块标识符brotli_module
源文件mod_brotli.c
兼容性在版本 2.4.26 及更高版本中可用。

摘要

mod_brotli 模块提供 BROTLI_COMPRESS 输出过滤器,允许在通过网络将服务器输出发送到客户端之前,使用 brotli 压缩格式压缩输出。此模块使用 Brotli 库,可在 https://github.com/google/brotli 找到。

Support Apache!

主题

指令

错误修复清单

另请参阅

top

示例配置

压缩和 TLS

当 TLS 连接传输压缩数据时,某些 Web 应用程序容易受到信息泄露攻击。有关更多信息,请查看“BREACH”系列攻击的详细信息。

这是一个简单的配置,它压缩常见的基于文本的内容类型。

仅压缩少数类型

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

启用压缩

压缩和 TLS

当 TLS 连接传输压缩数据时,某些 Web 应用程序容易受到信息泄露攻击。有关更多信息,请查看“BREACH”系列攻击的详细信息。

输出压缩

压缩由 BROTLI_COMPRESS 过滤器 实现。以下指令将为放置它的容器中的文档启用压缩

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

如果您想将压缩限制为一般情况下特定 MIME 类型,可以使用 AddOutputFilterByType 指令。以下是如何仅为 Apache 文档的 html 文件启用压缩的示例

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

注意

BROTLI_COMPRESS 过滤器始终插入在 RESOURCE 过滤器(如 PHP 或 SSI)之后。它从不触及内部子请求。

注意

有一个环境变量 no-brotli,通过 SetEnv 设置,它将禁用特定请求的 brotli 压缩,即使客户端支持它。
top

处理代理服务器

mod_brotli 模块发送 Vary: Accept-Encoding HTTP 响应头以提醒代理,缓存的响应应仅发送给发送适当 Accept-Encoding 请求头的客户端。这可以防止将压缩内容发送到无法理解它的客户端。

如果您使用一些依赖于例如 User-Agent 头部的特殊排除,则必须手动配置对 Vary 头部的添加以提醒代理有关其他限制。例如,在典型的配置中,BROTLI_COMPRESS 过滤器的添加取决于 User-Agent,您应该添加

Header append Vary User-Agent

如果您的压缩决策取决于除请求头之外的其他信息(例如 HTTP 版本),则必须将 Vary 头部设置为 * 值。这会阻止符合标准的代理完全缓存。

示例

Header set Vary *
top

提供预压缩内容

由于 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>
top

BrotliAlterETag 指令

描述压缩期间应如何修改传出的 ETag 头部
语法BrotliAlterETag AddSuffix|NoChange|Remove
默认值BrotliAlterETag AddSuffix
上下文服务器配置,虚拟主机
状态扩展
模块mod_brotli

BrotliAlterETag 指令指定在压缩响应时应如何更改 ETag 头部。

AddSuffix

将压缩方法附加到 ETag 的末尾,导致压缩和未压缩表示具有唯一的 ETag。在另一个动态压缩模块 mod_deflate 中,这是自 2.4.0 以来默认值。此设置可以防止向压缩内容的条件请求提供“HTTP 未修改”(304)响应。

NoChange

不要更改压缩响应的 ETag。在另一个动态压缩模块 mod_deflate 中,这是在 2.4.0 之前的默认值。此设置不满足 HTTP/1.1 属性,即同一资源的所有表示都具有唯一的 ETag。

Remove

从压缩响应中删除 ETag 头部。这会阻止一些条件请求变得可能,但会避免前面选项的缺点。

top

BrotliCompressionMaxInputBlock 指令

描述最大输入块大小
语法BrotliCompressionMaxInputBlock value
默认值(自动)
上下文服务器配置,虚拟主机
状态扩展
模块mod_brotli

BrotliCompressionMaxInputBlock 指令指定 16 到 24 之间的最大输入块大小,但需要注意的是,较大的块大小需要更多内存。

top

BrotliCompressionQuality 指令

描述压缩质量
语法BrotliCompressionQuality value
默认值BrotliCompressionQuality 5
上下文服务器配置,虚拟主机
状态扩展
模块mod_brotli

BrotliCompressionQuality 指令指定压缩质量(0 到 11 之间的值)。较高的质量值会导致更好的压缩,但也更慢。

top

BrotliCompressionWindow 指令

描述Brotli 滑动压缩窗口大小
语法BrotliCompressionWindow value
默认值BrotliCompressionWindow 18
上下文服务器配置,虚拟主机
状态扩展
模块mod_brotli

BrotliCompressionWindow 指令指定 brotli 滑动压缩窗口大小(10 到 24 之间的值)。较大的窗口大小可以提高压缩质量,但需要更多内存。

top

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

另请参阅

可用语言:  en  |  fr 

top

评论

注意
这不是问答部分。此处放置的评论应针对改进文档或服务器的建议,如果它们被实施或被认为无效/与主题无关,可能会被我们的版主删除。有关如何管理 Apache HTTP Server 的问题应发送到我们的 IRC 频道 #httpd(在 Libera.chat 上)或发送到我们的 邮件列表