mod_brotli
描述: | 在将内容传送到 client 之前通过 Brotli 压缩内容 |
状态: | 延期 |
模块标识符: | brotli_module |
源文件: | mod_brotli.c |
兼容性: | 可在 version 2.4.26 及更高版本中使用。 |
摘要
mod_brotli模块提供BROTLI_COMPRESS
输出过滤器,允许使用 brotli 压缩格式压缩服务器的输出,然后通过网络发送到 client。此模块使用https://github.com/google/brotli处的 Brotli library。
Sample 配置
压缩和 TLS
当 TLS 连接携带压缩数据时,某些 web applications 容易受到信息泄露攻击。有关更多信息,请查看“BREACH”攻击系列的详细信息。
这是一个简单的 configuration 压缩 common text-based 内容类型。
仅压缩几种类型
AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/xml text/css text/javascript application/javascript
启用压缩
压缩和 TLS
当 TLS 连接携带压缩数据时,某些 web applications 容易受到信息泄露攻击。有关更多信息,请查看“BREACH”攻击系列的详细信息。
输出压缩
压缩由BROTLI_COMPRESS
过滤实现。以下指令将为容器中的文档启用压缩:
SetOutputFilter BROTLI_COMPRESS SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-brotli
如果要将压缩限制为特定的 MIME 类型,则可以使用AddOutputFilterByType指令。以下是仅为 Apache 文档的 html files 启用压缩的示例:
<Directory "/your-server-root/manual"> AddOutputFilterByType BROTLI_COMPRESS text/html </Directory>
注意
始终在诸如 PHP 或 SSI 之类的 RESOURCE 过滤器之后插入BROTLI_COMPRESS
过滤器。它从不接触内部子请求。
注意
有一个环境变量no-brotli
,通过SETENV设置,它将禁用特定请求的 brotli 压缩,即使 client 支持它。
处理代理服务器
mod_brotli模块发送Vary: Accept-Encoding
HTTP 响应头以警告代理,缓存响应应仅发送给发送相应Accept-Encoding
请求头的 clients。这可以防止将压缩内容发送到不理解它的客户端。
如果您使用某些特殊排除项(例如,User-Agent
标头),则必须手动配置Vary
标头的添加项以警告代理的其他限制。例如,在添加BROTLI_COMPRESS
过滤器取决于User-Agent
的典型 configuration 中,您应该添加:
Header append Vary User-Agent
如果您关于压缩的决定取决于请求 headers(e.g. HTTP version)之外的其他信息,则必须将Vary
标头设置为 value *
。这可以防止兼容代理完全缓存。
例
Header set Vary *
提供 pre-compressed 内容
由于mod_brotli re-compresses 内容每个 time 都会发出一个请求,因此可以通过 pre-compressing 内容推导出一些 performance 的好处,并告诉 mod_brotli 在没有 re-compressing 的情况下为它们提供服务。这可以使用如下的 configuration 来完成:
<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 |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_brotli |
BrotliAlterETag
指令指定在压缩响应时应如何更改 ETag hader。
- AddSuffix
将压缩方法附加到 ETag 的末尾,导致压缩和未压缩的表示具有唯一的 ETag。在另一个动态压缩模块 mod_deflate 中,这是自 2.4.0 以来的默认值。此设置可防止对压缩内容的条件请求提供“HTTP Not Modified”(304)响应。 - 没变
不要在压缩响应上更改 ETag。在另一个动态压缩模块 mod_deflate 中,这是 2.4.0 之前的默认值。此设置不满足 HTTP/1.1 property,即同一资源的所有表示都具有唯一的 ETag。 - 去掉
从压缩响应中删除 ETag 标头。这可以防止某些条件请求成为可能,但避免了前面选项的缺点。
BrotliCompressionMaxInputBlock 指令
描述: | 最大输入块大小 |
句法: | BrotliCompressionMaxInputBlock value |
默认: | (automatic) |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_brotli |
BrotliCompressionMaxInputBlock
指令指定 16 到 24 之间的最大输入块大小,但需要注意的是更大的块大小需要更多 memory。
BrotliCompressionQuality 指令
描述: | 压缩质量 |
句法: | BrotliCompressionQuality value |
默认: | BrotliCompressionQuality 5 |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_brotli |
BrotliCompressionQuality
指令指定压缩质量(0 到 11 之间的值)。质量越高,压缩效果越好,但速度也越慢。
BrotliCompressionWindow 指令
描述: | Brotli 滑动压缩窗口尺寸 |
句法: | BrotliCompressionWindow value |
默认: | BrotliCompressionWindow 18 |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_brotli |
BrotliCompressionWindow
指令指定 brotli 滑动压缩窗口大小(值在 10 到 24 之间)。较大的窗口大小可以提高压缩质量,但需要更多 memory。
BrotliFilterNote 指令
描述: | 将压缩率放在 logging 的注释中 |
句法: | BrotliFilterNote[type] notename |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_brotli |
BrotliFilterNote
指令指定应将有关压缩率的注释附加到请求。注释的 name 是为指令指定的 value。您可以通过将 value 添加到访问 log来将该注释用于统计目的。
例
BrotliFilterNote ratio LogFormat '"%r" %b (%{ratio}n) "%{User-agent}i"' brotli CustomLog "logs/brotli_log" brotli
如果要从日志中提取更准确的值,可以使用 type 参数指定作为 logging 注释的数据类型。类型可以是以下之一:
Input
在笔记中存储过滤器输入流的字节数。Output
在笔记中存储过滤器输出流的字节数。Ratio
在笔记中存储压缩率(output/input * 100)。如果省略 type 参数,则这是默认值。
因此你可以用这样的方式 log:
准确 Logging
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