• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 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

    上篇:mod_autoindex

    下篇:mod_buffer