本页内容

  • 1 启用 mod_deflate
  • 2 配置 mod_deflate 2.1 按 MIME 类型显式包含文件 2.2 按扩展名显式排除文件 2.3 更多配置指令 3 测试
  • 4 链接
  • 2.1 按 MIME 类型显式包含文件
  • 2.2 按扩展名显式排除文件
  • 2.3 更多配置指令
  • 3 测试

在本教程中,我将介绍如何在 Apache2 网页服务器上安装并配置 mod_deflate。mod_deflate 允许 Apache2 压缩文件并将其传送给能够处理压缩内容的客户端(例如浏览器),大多数现代浏览器都具备此能力。借助 mod_deflate,你可以将 HTML、文本或 XML 文件压缩到约其原始大小的 20% - 30%,从而节省服务器流量并让你的拨号用户更满意。

压缩文件会导致服务器负载略有上升,但据我的经验,这一点会被客户端连接到你服务器的耗时大幅减少所抵消。例如,一个需要七秒才能下载未压缩 HTML 文件的拨号用户,现在可能只需要两秒就能下载同样的但已压缩的文件。

通过使用 mod_deflate,你不必担心会排除那些无法处理压缩内容的老旧浏览器用户。浏览器会在传输任何文件之前与服务器协商,如果浏览器无法处理压缩内容,服务器会以未压缩方式传送文件。

在 Apache2 中,mod_deflate 已取代 Apache 1.3 的 mod_gzip。如果你想用 Apache 1.3 提供压缩文件,请查看本教程:mod_gzip - serving compressed content by the Apache webserver

我想首先说明,这并不是搭建此类系统的唯一方法。实现这一目标有许多方法,但这是我采用的方式。我不作任何保证,它一定适用于你!

1 启用 mod_deflate

如果你已安装 Apache2,mod_deflate 应该也已经安装在你的系统上。现在我们需要启用它。在 Debian 上,我们可以这样做:

a2enmod deflate

然后重启 Apache2:

service apache2 restart

在其他发行版上,你可能需要手动编辑 Apache2 的配置来启用 mod_deflate。你可能需要在 LoadModule 部分添加类似这样的一行:

LoadModule deflate_module /usr/lib/apache2/modules/mod_deflate.so

请确保调整 mod_deflate.so 的路径,并在之后重启 Apache2。

2 配置 mod_deflate

文件的压缩可以通过两种方式之一进行配置:要么按扩展名显式排除文件,要么按 MIME 类型显式包含文件。你可以为整个 Apache2 服务器启用 mod_deflate,或者仅为特定的虚拟站点启用。据此,现在要么打开 Apache2 的全局服务器配置部分,要么只打开你要启用 mod_deflate 的 vhost 配置部分。

2.1 按 MIME 类型显式包含文件

如果你只想压缩 HTML、文本和 XML 文件,请将这一行添加到你的配置中:

AddOutputFilterByType DEFLATE text/html text/plain text/xml

这是我正在使用的配置,因为我不想压缩图像或 PDF 文件,也不想压缩 zip 等已经压缩过的文件。

2.2 按扩展名显式排除文件

如果你想压缩所有文件类型而只排除少数几种,你可以在配置中添加类似这样的内容(取代 2.1 节中的那一行):

SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ \
    no-gzip dont-vary
SetEnvIfNoCase Request_URI \
    \.(?:exe|t?gz|zip|bz2|sit|rar)$ \
    no-gzip dont-vary
SetEnvIfNoCase Request_URI \.pdf$ no-gzip dont-vary

这会压缩除图像(gif、jpg 和 png)、已经压缩过的文件(如 zip 和 tar.gz)以及 PDF 文件之外的所有文件,这是合理的,因为压缩这些文件类型收益甚微。

2.3 更多配置指令

无论你使用 2.1 节还是 2.2 节的配置,都应该将以下这些行添加到你的配置中:

BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

这些行是针对一些不支持压缩 HTML 文档之外其他文件的老旧浏览器。

配置现已完成,你现在必须重启 Apache2。在 Debian 上,你可以这样做:

service apache2 restart

要了解更多配置指令,请查看 Apache Module mod_deflate。

3 测试

为了测试我们的压缩效果,我们在 mod_deflate 配置中添加几条指令,用于记录所传送文件的压缩比。打开你的 mod_deflate 配置并添加以下行:

DeflateFilterNote Input input_info
DeflateFilterNote Output output_info
DeflateFilterNote Ratio ratio_info
LogFormat '"%r" %{output_info}n/%{input_info}n (%{ratio_info}n%%)' deflate
CustomLog /var/log/apache2/deflate_log deflate

请确保将 /var/log/apache2 替换为你 Apache2 的日志目录。它可能是 /var/log/httpd、/var/log/httpd2 等。

然后重启 Apache2。在 Debian 上,你可以这样做:

service apache2 restart

现在,每当有文件被请求时,这将被记录到 /var/log/apache2/deflate_log(或你改成的任何文件)中。一条典型的日志行如下所示:

"GET /info.php HTTP/1.1" 7621/45430 (16%)

你可以看到文件 info.php 被请求并传送。它的原始大小为 45430 字节,被压缩到了 7621 字节,即原始大小的 16%!这是一个很好的结果,如果你的网站主要由 HTML、文本和 XML 文件组成,mod_deflate 将为你节省大量流量,而对于低带宽连接的用户,你的网站加载速度也会快得多。

如果在测试后你不再需要日志记录,可以撤销 3 节中的更改并重启 Apache2。

4 链接

  • Apache Module mod_deflate: http://httpd.apache.org/docs/2.0/mod/mod_deflate.html
  • mod_gzip - serving compressed content by the Apache webserver: https://www.howtoforge.com/linux_apache_mod_gzip