Apache 模块 mod_deflate

Description:在将内容交付给 Client 端之前先对其进行压缩
Status:Extension
Module Identifier:deflate_module
Source File:mod_deflate.c

Summary

mod_deflate模块提供DEFLATE输出过滤器,该过滤器允许压缩服务器中的输出,然后再通过网络发送给 Client 端。

Supported Encodings

唯一支持gzip编码以确保与旧的浏览器实现完全兼容。不支持deflate编码,请检查zlib's documentation以获取完整说明。

Sample Configurations

Compression and TLS

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

这是压缩常见的基于文本的 Content Type 的简单配置。

仅压缩几种类型

AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript

Enabling Compression

Compression and TLS

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

Output Compression

压缩是由DEFLATE filter实现的。以下伪指令将启用对其所在容器中文档的压缩:

SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png)$" no-gzip

通常,如果要将压缩限制为特定的 MIME 类型,则可以使用AddOutputFilterByType指令。这是仅对 Apache 文档的 html 文件启用压缩的示例:

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

Note

DEFLATE过滤器始终插入在 PHP 或 SSI 之类的 RESOURCE 过滤器之后。它从不涉及内部子请求。

Note

通过SetEnv设置了一个环境变量force-gzip,它将忽略浏览器的接受编码设置,并发送压缩的输出。

Output Decompression

mod_deflate模块还提供了用于对 gzip 压缩响应主体进行充气/解压缩的过滤器。为了激活此功能,您必须使用SetOutputFilterAddOutputFilterINFLATE过滤器插入输出过滤器链,例如:

<Location "/dav-area">
    ProxyPass "http://example.com/"
    SetOutputFilter INFLATE
</Location>

本示例将解压缩 example.com 的 gzip 输出,因此其他过滤器可以对其进行进一步处理。

Input Decompression

mod_deflate模块还提供了用于解压缩 gzip 压缩请求正文的过滤器。为了激活此功能,您必须使用SetInputFilterAddInputFilterDEFLATE过滤器插入到 Importing 过滤器链中,例如:

<Location "/dav-area">
    SetInputFilter DEFLATE
</Location>

现在,如果请求包含Content-Encoding: gzipHeaders,则正文将自动解压缩。很少有浏览器能够 gzip 请求正文。但是,实际上某些特殊应用程序确实支持请求压缩,例如某些WebDAVClient 端。

Note on Content-Length

如果您自己评估请求主体,请不要信任Content-LengthHeaders! Content-Length Headers 反映了来自 Client 端的传入数据的长度,而不反映了解压缩数据流的字节数。

处理代理服务器

mod_deflate模块发送Vary: Accept-Encoding HTTP 响应 Headers,以警告代理应将缓存的响应仅发送给发送适当的Accept-Encoding请求 Headers 的 Client 端。这样可以防止将压缩的内容发送给无法理解的 Client 端。

如果您使用某些特殊的排除项,例如User-AgentHeaders,则必须手动配置VaryHeaders 的附加项,以向代理警告其他限制。例如,在DEFLATE过滤器的添加取决于User-Agent的典型配置中,应添加:

Header append Vary User-Agent

如果您对压缩的决定取决于请求 Headers(例如* HTTP 版本)以外的其他信息,则必须将VaryHeaders 设置为值*。这样可以防止兼容代理完全缓存。

Example

Header set Vary *

提供预压缩的内容

由于mod_deflate每次发出请求时都会重新压缩内容,因此可以通过预压缩内容并告诉mod_deflate为其提供服务而无需重新压缩它们,从而获得一些性能优势。可以使用类似以下的配置来完成此操作:

<IfModule mod_headers.c>
    # Serve gzip compressed CSS and JS files if they exist
    # and the client accepts gzip.
    RewriteCond "%{HTTP:Accept-encoding}" "gzip"
    RewriteCond "%{REQUEST_FILENAME}\.gz" -s
    RewriteRule "^(.*)\.(css|js)"         "$1\.$2\.gz" [QSA]

    # Serve correct content types, and prevent mod_deflate double gzip.
    RewriteRule "\.css\.gz$" "-" [T=text/css,E=no-gzip:1]
    RewriteRule "\.js\.gz$"  "-" [T=text/javascript,E=no-gzip:1]

    <FilesMatch "(\.js\.gz|\.css\.gz)$">
      # Serve correct encoding type.
      Header append Content-Encoding gzip

      # Force proxies to cache gzipped &
      # non-gzipped css/js files separately.
      Header append Vary Accept-Encoding
    </FilesMatch>
</IfModule>

DeflateBufferSize Directive

Description:zlib 一次压缩片段大小
Syntax:DeflateBufferSize value
Default:DeflateBufferSize 8096
Context:服务器配置,虚拟主机
Status:Extension
Module:mod_deflate

DeflateBufferSize指令指定 zlib 一次压缩的片段的大小(以字节为单位)。如果压缩后的响应大小大于此指令指定的大小,则 httpd 将切换为分块编码(HTTP HeadersTransfer-Encoding设置为Chunked),其副作用是不设置任何Content-Length HTTP Headers。当 httpd 在反向缓存代理后面工作时,或者当 httpd 配置有mod_cachemod_cache_disk时,这尤其重要,因为可能不会缓存没有任何Content-Length头的 HTTP 响应。

DeflateCompressionLevel Directive

Description:我们对输出应用多少压缩
Syntax:DeflateCompressionLevel value
Default:Zlib's default
Context:服务器配置,虚拟主机
Status:Extension
Module:mod_deflate

DeflateCompressionLevel伪指令指定应使用的压缩级别,该值越高,压缩越好,但是实现该压缩需要更多的 CPU 时间。

该值必须介于 1(较少压缩)和 9(较大压缩)之间。

DeflateFilterNote Directive

Description:将压缩率放在 Logging 的 Comments 中
Syntax:DeflateFilterNote [type] notename
Context:服务器配置,虚拟主机
Status:Extension
Module:mod_deflate

DeflateFilterNote指令指定有关压缩率的 Comments 应附加到请求中。Comments 的名称是为指令指定的值。您可以通过将该值添加到access log来将该 Comments 用于统计目的。

Example

DeflateFilterNote ratio

LogFormat '"%r" %b (%{ratio}n) "%{User-agent}i"' deflate
CustomLog "logs/deflate_log" deflate

如果要从日志中提取更准确的值,则可以使用 type 参数来指定作为日志记录留下的数据类型。类型可以是以下之一:

  • Input

    • 将过滤器 Importing 流的字节数存储在 Comments 中。
  • Output

    • 将过滤器输出流的字节数存储在 Comments 中。
  • Ratio

    • 将压缩率(output/input * 100)存储在笔记中。如果省略 type 参数,则这是默认设置。

因此,您可以这样记录它:

Accurate Logging

DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio

LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
CustomLog "logs/deflate_log" deflate

See also

DeflateInflateLimitRequestBody Directive

Description:膨胀的请求主体的最大大小
Syntax:DeflateInflateLimitRequestBody value
Default:None, but LimitRequestBody applies after deflation
Context:服务器配置,虚拟主机,目录,.htaccess
Status:Extension
Module:mod_deflate
Compatibility:2 .4.10 及更高版本

DeflateInflateLimitRequestBody指令指定膨胀的请求正文的最大大小。如果未设置,则将LimitRequestBody应用于充气后的物体。

DeflateInflateRatioBurst Directive

Description:可以超过请求主体的通货膨胀率的最大次数
Syntax:DeflateInflateRatioBurst value
Default:DeflateInflateRatioBurst 3
Context:服务器配置,虚拟主机,目录,.htaccess
Status:Extension
Module:mod_deflate
Compatibility:2 .4.10 及更高版本

DeflateInflateRatioBurst指令指定在终止请求之前可以交叉DeflateInflateRatioLimit的最大次数。

DeflateInflateRatioLimit Directive

Description:请求机构的最大通胀率
Syntax:DeflateInflateRatioLimit value
Default:DeflateInflateRatioLimit 200
Context:服务器配置,虚拟主机,目录,.htaccess
Status:Extension
Module:mod_deflate
Compatibility:2 .4.10 及更高版本

DeflateInflateRatioLimit指令指定膨胀的请求主体的压缩大小与膨胀大小的最大比率。在流式处理正文时检查此比率,如果 Span 超过DeflateInflateRatioBurst次,则请求将被终止。

DeflateMemLevel Directive

Description:zlib 应该使用多少内存进行压缩
Syntax:DeflateMemLevel value
Default:DeflateMemLevel 9
Context:服务器配置,虚拟主机
Status:Extension
Module:mod_deflate

DeflateMemLevel指令指定 zlib 应使用多少内存进行压缩(介于 1 到 9 之间的值)。

DeflateWindowSize Directive

Description:Zlib 压缩窗口大小
Syntax:DeflateWindowSize value
Default:DeflateWindowSize 15
Context:服务器配置,虚拟主机
Status:Extension
Module:mod_deflate

DeflateWindowSize指令指定 zlib 压缩窗口的大小(介于 1 到 15 之间的值)。通常,窗口大小越大,可以预期的压缩率就越高。