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 之间)。通常,窗口尺寸越大,预期压缩比越高。