介绍
Mod_deflate 是一个 Apache 模块,它允许您的 Web 服务器的输出在发送到客户端之前进行压缩。 一旦网站内容的大小被压缩,它的大小就会变小,客户可以更快地下载它。 这不仅对带宽较低的客户很有价值,而且在评估您的网站性能及其页面排名时,搜索引擎也会考虑到这一点。
除了压缩内容,mod_deflate 还可以用于解压缩目的。 如果您使用 Apache 作为反向代理并且您希望进一步处理通过代理的内容,则此技术将适用。 然而,这种技术的用途非常有限。 我们将把文章的重点放在使用 mod_deflate 进行压缩上。
先决条件
本指南已在 CentOS 7 上测试。 模块安装和配置与操作系统或操作系统版本无关,但配置文件的位置可能因操作系统及其版本而异。
它还假设您正在运行 Apache 2.4.0 或更高版本。 要安装 Apache,请按照 如何在 CentOS 上安装 Linux、Apache、MySQL、PHP (LAMP) 堆栈的第 1 步操作。
本教程中的所有命令都应以非 root 用户身份运行。 如果该命令需要 root 访问权限,它将在前面加上 sudo
。 如果您还没有设置,请按照本教程进行操作:CentOS 7 上的初始服务器设置。
安装
Mod_deflate 在 CentOS 7 上的默认 Apache 安装中包含并启用。 要确认这一点,请运行 apachectl
,Apache 服务器控制接口,并使用 grep
为关键字 deflate
过滤输出,如下所示:
apachectl -t -D DUMP_MODULES |grep deflate
如果安装并启用了 mod_deflate,您应该会看到 deflate_module (shared)
。 如果您没有看到这一点,请按照以下故障排除步骤操作:
- 确保已安装模块文件。 该文件是核心
httpd
软件包的一部分,您应该已经按照前面提到的先决条件安装了该软件包。 默认情况下,它位于/etc/httpd/modules/mod_deflate.so
中。 此外,Web 服务器应该能够打开此文件。 为此,mod_deflate.so
应该具有世界可读的权限,例如 755。 - 检查模块是否已加载。 打开 Apache 基本模块配置文件
/etc/httpd/conf.modules.d/00-base.conf
并确保此行存在且未被注释掉:
LoadModule deflate_module modules/mod_deflate.so
注意: 如果您不得不更改 Apache 配置,请不要忘记重新启动 Apache。 重启指令为sudo apachectl restart
。
配置
要开始使用 mod_deflate,您必须指定应压缩的文件类型。 一方面,纯文本格式可以通过压缩大大减小大小,这就是为什么将其应用于 HTML、CSS 或 JavaScript 文件是有意义的。 另一方面,很多多媒体格式如Flash、图片等已经有压缩功能,再多压缩也无济于事。
要配置 mod_deflate,请使用示例代码创建一个新的配置文件 /etc/httpd/conf.d/mod_deflate.conf
:
/etc/httpd/conf.d/mod_deflate.conf
<filesMatch "\.(js|html|css)$"> SetOutputFilter DEFLATE </filesMatch>
上面的代码意味着当文件匹配扩展名 .js
、.html
或 .css
时,它将通过标准的 Apache SetOutputFilter
指令进行压缩(放气)。 您可以添加在您的站点上找到的其他类似的文本文件扩展名,例如 .txt
。
注意:你可以把上面的代码放在主配置文件/etc/httpd/conf/httpd.conf
中。 但是,最好将这些特定的配置部分分隔在不同的文件中。 为此,在 CentOS 7 中,由于主 Apache 配置文件末尾的指令 IncludeOptional conf.d/*.conf
,位于目录 /etc/httpd/conf.d/
中的任何扩展名为 .conf
的文件都会自动加载。
此外,mod_deflate 有一些自己的重要配置选项:
DeflateCompressionLevel
- 要应用的压缩级别。 默认情况下,此级别为 9,即最高压缩级别。 1 是最小的压缩级别。 更高的压缩率会以更高的服务器 CPU 使用率产生最小的输出。DeflateMemLevel
- 压缩库 zlib 可以使用的内存量。 默认值为 9,这也是最高值。 要精确计算允许的内存,您应该将DeflateMemLevel
值乘以 16K。DeflateWindowSize
- 压缩窗口大小。 默认情况下,它是可能的最高值 15。 更高的数字意味着更高的压缩级别,同样以更多的服务器资源为代价。
在大多数情况下,您可以将上述值保留为默认值。 但是,如果您怀疑使用 mod_deflate 后您的服务器性能明显恶化,您可以在配置文件 /etc/httpd/conf.d/mod_deflate.conf
中配置较低的值,如下所示:
DeflateCompressionLevel 1
以上将降低压缩级别,这将导致文件变大。 但是,mod_deflate 这样会使用更少的 CPU。 如果您决定应用任何此类更改,请确保重新启动 Apache。
测试
有多种测试 mod_deflate 的方法,但最简单的方法是使用非交互式网络下载器 wget。 如果您的 CentOS 7 Droplet 上还没有它,那么您可以使用命令 sudo yum install -y wget
安装它。
对于测试,您需要一个至少几百 KB 的文本文件,压缩后会变小。 如果您手头没有这样的文件,您可以下载流行的 JavaScript 库 JQuery 并将其上传到您的站点。 如果您不确定将文件放在哪里,您可以简单地将其上传到 Apache 默认文档根目录,即 CentOS 7 中的 /var/www/html/
。 因此,该文件将在您的默认站点的根目录中可用。
注意: 为了使 mod_deflate 压缩输出,客户端(通常是浏览器)必须支持压缩。 如果客户端不支持压缩,则文件将按原样发送。
将示例测试文件上传到您的站点后,使用 wget
下载它。 您可以从本地计算机或 Droplet 执行此测试。 像这样:
wget --header="Accept-Encoding: gzip" http://<your_server_ip>/jquery-1.11.3.js
在上面的示例中,您正在从 Apache 服务器下载 jquery-1.11.3.js
文件。 为了使用压缩,我们传递了额外的 wget
头参数 Accept-Encoding: gzip
。
当以上述方式下载时,文件 jquery-1.11.3.js
应该是 83KB。 事实上,这与原始的 JavaScript 文件并不完全相同,它应该由客户端额外提取,这也造成了客户端的一些开销。 但是,通过网络传输的大小仅为 83KB,比原始文件 (278K) 小三倍多。
您可以首先通过检查下载文件的大小来确认上述计算,使用 Linux 命令列出目录内容 ls
,如下所示:
ls -lah jquery-1.11.3.js -rw-r--r-- 1 user user 83K Apr 28 12:20 jquery-1.11.3.js
然后您可以使用 ls
命令再次将结果与您网站上的原始文件进行比较:
ls -lah /var/www/html/jquery-1.11.3.js -rw-r--r-- 1 apache apache 278K Apr 28 12:20 /var/www/html/jquery-1.11.3.js
结论
正如您从本文和 JQuery 库的实际示例中看到的那样,Mod_deflate 可以帮助您显着降低站点的带宽需求。 要继续优化您的站点,请阅读 Apache 内容缓存 ,这是启用 mod_deflate 后的下一个合乎逻辑的步骤。