On this page
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 压缩响应主体进行充气/解压缩的过滤器。为了激活此功能,您必须使用SetOutputFilter或AddOutputFilter将INFLATE
过滤器插入输出过滤器链,例如:
<Location "/dav-area">
ProxyPass "http://example.com/"
SetOutputFilter INFLATE
</Location>
本示例将解压缩 example.com 的 gzip 输出,因此其他过滤器可以对其进行进一步处理。
Input Decompression
mod_deflate模块还提供了用于解压缩 gzip 压缩请求正文的过滤器。为了激活此功能,您必须使用SetInputFilter或AddInputFilter将DEFLATE
过滤器插入到 Importing 过滤器链中,例如:
<Location "/dav-area">
SetInputFilter DEFLATE
</Location>
现在,如果请求包含Content-Encoding: gzip
Headers,则正文将自动解压缩。很少有浏览器能够 gzip 请求正文。但是,实际上某些特殊应用程序确实支持请求压缩,例如某些WebDAVClient 端。
Note on Content-Length
如果您自己评估请求主体,请不要信任Content-Length
Headers! Content-Length Headers 反映了来自 Client 端的传入数据的长度,而不反映了解压缩数据流的字节数。
处理代理服务器
mod_deflate模块发送Vary: Accept-Encoding
HTTP 响应 Headers,以警告代理应将缓存的响应仅发送给发送适当的Accept-Encoding
请求 Headers 的 Client 端。这样可以防止将压缩的内容发送给无法理解的 Client 端。
如果您使用某些特殊的排除项,例如User-Agent
Headers,则必须手动配置Vary
Headers 的附加项,以向代理警告其他限制。例如,在DEFLATE
过滤器的添加取决于User-Agent
的典型配置中,应添加:
Header append Vary User-Agent
如果您对压缩的决定取决于请求 Headers(例如* HTTP 版本)以外的其他信息,则必须将Vary
Headers 设置为值*
。这样可以防止兼容代理完全缓存。
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_cache和mod_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 之间的值)。通常,窗口大小越大,可以预期的压缩率就越高。