mod_deflate
| 描述: | 在将内容传递给 client 之前压缩内容 |
| 状态: | 延期 |
| 模块标识符: | deflate_module |
| 源文件: | mod_deflate.c |
摘要
mod_deflate模块提供DEFLATE输出过滤器,允许服务器的输出在通过网络发送到 client 之前进行压缩。
支持的编码
gzip编码是唯一支持以确保与旧浏览器 implementation 完全兼容的编码。不支持deflate编码,请查看zlib 的文档以获取完整说明。
Sample 配置
压缩和 TLS
当 TLS 连接携带压缩数据时,某些 web applications 容易受到信息泄露攻击。有关更多信息,请查看“BREACH”攻击系列的详细信息。
这是一个简单的 configuration 压缩 common text-based 内容类型。
仅压缩几种类型
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
启用压缩
压缩和 TLS
当 TLS 连接携带压缩数据时,某些 web applications 容易受到信息泄露攻击。有关更多信息,请查看“BREACH”攻击系列的详细信息。
输出压缩
压缩由DEFLATE过滤实现。以下指令将为容器中的文档启用压缩:
SetOutputFilter DEFLATE SetEnvIfNoCase Request_URI ".(?:gif|jpe?g|png)$" no-gzip
如果要将压缩限制为特定的 MIME 类型,则可以使用AddOutputFilterByType指令。以下是仅为 Apache 文档的 html files 启用压缩的示例:
<Directory "/your-server-root/manual">
AddOutputFilterByType DEFLATE text/html
</Directory>
注意
始终在诸如 PHP 或 SSI 之类的 RESOURCE 过滤器之后插入DEFLATE过滤器。它从不接触内部子请求。
注意
有一个环境变量force-gzip,通过SETENV设置,它将忽略浏览器的 accept-encoding 设置并发送压缩输出。
输出解压缩
mod_deflate模块还为 inflating/uncompressing gzip 压缩响应体提供过滤器。在 order 中激活此 feature,您必须使用SetOutputFilter或AddOutputFilter将INFLATE过滤器插入到输出过滤器链中,对于 example:
<Location "/dav-area">
ProxyPass "http://example.com/"
SetOutputFilter INFLATE
</Location>
此 Example 将从 example.com 解压缩 gzip 的输出,因此其他过滤器可以使用它进行进一步处理。
输入解压缩
mod_deflate模块还提供了一个用于解压缩 gzip 压缩请求体的过滤器。在 order 中激活此 feature,您必须使用SetInputFilter或AddInputFilter将DEFLATE过滤器插入到输入过滤器链中,对于 example:
<Location "/dav-area">
SetInputFilter DEFLATE
</Location>
现在,如果请求包含Content-Encoding: gzip标头,则会自动解压缩主体。很少有浏览器能够 gzip 请求正文。但是,一些特殊的 applications 实际上支持请求压缩,例如一些WebDAV clients。
关于 Content-Length 的说明
如果您自己评估请求体,请不要相信Content-Length标头! Content-Length 标头反映了来自 client 的传入数据的长度,而不是解压缩数据流的字节数。
处理代理服务器
mod_deflate模块发送Vary: Accept-Encoding HTTP 响应头以警告代理,缓存响应应仅发送给发送相应Accept-Encoding请求头的 clients。这可以防止将压缩内容发送到不理解它的客户端。
如果您使用某些特殊排除项(例如,User-Agent标头),则必须手动配置Vary标头的添加项以警告代理的其他限制。例如,在添加DEFLATE过滤器取决于User-Agent的典型 configuration 中,您应该添加:
Header append Vary User-Agent
如果您关于压缩的决定取决于请求 headers(e.g. HTTP version)之外的其他信息,则必须将Vary标头设置为 value *。这可以防止兼容代理完全缓存。
例
Header set Vary *
提供 pre-compressed 内容
由于mod_deflate re-compresses 内容在每个 time 时都有一个请求,因此 pre-compressing 内容可以导出一些_性能好处,并告诉mod_deflate在没有 re-compressing 的情况下为它们提供服务。这可以使用如下的 configuration 来完成:
<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 指令
| 描述: | 片段大小由 zlib 在一个 time 压缩 |
| 句法: | DeflateBufferSize value |
| 默认: | DeflateBufferSize 8096 |
| Context: | server config,virtual host |
| 状态: | 延期 |
| 模块: | mod_deflate |
DeflateBufferSize指令指定 zlib 应在一个 time 处压缩的片段的大小(以字节为单位)。如果压缩的响应大小大于此伪指令指定的大小,则 httpd 将切换到分块编码(HTTP 头Transfer-Encoding设置为Chunked),副作用是不设置任何Content-Length HTTP 头。当 httpd 在反向缓存代理后面工作或 httpd 配置为mod_cache和mod_cache_disk时,这一点尤其重要,因为没有任何Content-Length头的 HTTP 响应可能不会被缓存。
DeflateCompressionLevel 指令
| 描述: | 我们对输出应用了多少压缩 |
| 句法: | DeflateCompressionLevel value |
| 默认: | Zlib's default |
| Context: | server config,virtual host |
| 状态: | 延期 |
| 模块: | mod_deflate |
DeflateCompressionLevel指令指定应使用 level 压缩,value 越高,压缩越好,但实现此目的所需的 CPU time 时间越长。
值必须介于 1(压缩少)和 9(压缩更多)之间。
DeflateFilterNote 指令
| 描述: | 将压缩率放在 logging 的注释中 |
| 句法: | DeflateFilterNote[type] notename |
| Context: | server config,virtual host |
| 状态: | 延期 |
| 模块: | mod_deflate |
DeflateFilterNote指令指定应将有关压缩率的注释附加到请求。注释的 name 是为指令指定的 value。您可以通过将 value 添加到访问 log来将该注释用于统计目的。
例
DeflateFilterNote ratio
LogFormat '"%r" %b (%{ratio}n) "%{User-agent}i"' deflate
CustomLog "logs/deflate_log" deflate
如果要从日志中提取更准确的值,可以使用 type 参数指定作为 logging 注释的数据类型。类型可以是以下之一:
Input在笔记中存储过滤器输入流的字节数。Output
在笔记中存储过滤器输出流的字节数。Ratio
在笔记中存储压缩率(output/input * 100)。如果省略 type 参数,则这是默认值。
因此你可以用这样的方式 log:
准确 Logging
DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio
LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
CustomLog "logs/deflate_log" deflate
参见
- mod_log_config
DeflateInflateLimitRequestBody 指令
| 描述: | 膨胀的请求主体的最大大小 |
| 句法: | DeflateInflateLimitRequestBody value |
| 默认: | None, but LimitRequestBody applies after deflation |
| Context: | server config,virtual host,directory,.htaccess |
| 状态: | 延期 |
| 模块: | mod_deflate |
| 兼容性: | 2.4.10 及以后 |
DeflateInflateLimitRequestBody指令指定膨胀的请求主体的最大大小。如果未设置,LimitRequestBody将应用于膨胀的身体。
DeflateInflateRatioBurst 指令
| 描述: | 申请机构的通胀率可以超过的最大次数 |
| 句法: | DeflateInflateRatioBurst value |
| 默认: | DeflateInflateRatioBurst 3 |
| Context: | server config,virtual host,directory,.htaccess |
| 状态: | 延期 |
| 模块: | mod_deflate |
| 兼容性: | 2.4.10 及以后 |
DeflateInflateRatioBurst指令指定在终止请求之前可以越过DeflateInflateRatioLimit的最大次数。
DeflateInflateRatioLimit 指令
| 描述: | 请求机构的最大通胀率 |
| 句法: | DeflateInflateRatioLimit value |
| 默认: | DeflateInflateRatioLimit 200 |
| Context: | server config,virtual host,directory,.htaccess |
| 状态: | 延期 |
| 模块: | mod_deflate |
| 兼容性: | 2.4.10 及以后 |
DeflateInflateRatioLimit指令指定膨胀请求正文的缩小与膨胀大小的最大比率。正在流入主体时检查此比率,如果超过DeflateInflateRatioBurst次,则终止请求。
DeflateMemLevel 指令
| 描述: | zlib 应该使用多少 memory 进行压缩 |
| 句法: | DeflateMemLevel value |
| 默认: | DeflateMemLevel 9 |
| Context: | server config,virtual host |
| 状态: | 延期 |
| 模块: | mod_deflate |
DeflateMemLevel指令指定 zlib 应该使用多少 memory 进行压缩(值在 1 到 9 之间)。
DeflateWindowSize 指令
| 描述: | Zlib 压缩窗口大小 |
| 句法: | DeflateWindowSize value |
| 默认: | DeflateWindowSize 15 |
| Context: | server config,virtual host |
| 状态: | 延期 |
| 模块: | mod_deflate |
DeflateWindowSize指令指定 zlib 压缩窗口大小(值在 1 到 15 之间)。通常,窗口尺寸越大,预期压缩比越高。
