如何在 CentOS 7 上为 Nginx 添加 gzip 模块

简介

网站的加载速度取决于浏览器需要下载的所有文件的大小。减小需要传输的文件大小不仅能加快网站的加载速度,还能降低带宽使用费用。

gzip是一个流行的数据压缩程序。你可以配置 Nginx 使用 gzip 来即时压缩它提供的文件。然后,支持该程序的浏览器会在检索时解压缩这些文件,不会造成任何损失,但网络服务器和浏览器之间传输的数据量会减少。

由于压缩的一般工作方式以及 gzip 的工作方式,某些文件比其他文件压缩得更好。例如,文本文件的压缩效果非常好,通常压缩后的文件体积会缩小两倍以上。另一方面,JPEG 或 PNG 等图像文件本质上已经压缩,使用 gzip 进行二次压缩几乎不会产生任何效果。压缩文件会占用服务器资源,因此最好只压缩那些能显著减小文件大小的文件。

在本指南中,我们将讨论如何配置安装在 CentOS 7 服务器上的 Nginx,以利用 gzip 压缩技术减小发送给网站访问者的内容大小。

先决条件

要学习本教程,您需要

步骤 1 - 创建测试文件

在这一步中,我们将在默认 Nginx 目录中创建几个测试文件,以验证 gzip 的压缩效果。

在决定通过网络提供何种文件时,Nginx 不会分析文件内容,因为这样做速度不够快。取而代之的是,它只查找文件扩展名,以确定文件的 _MIME 类型,即文件的用途。

由于这种行为,测试文件的内容无关紧要。通过对文件进行适当命名,我们可以欺骗 Nginx,让它认为一个完全空白的文件是图像,而另一个则是样式表。

在我们的配置中,Nginx不会压缩非常小的文件,因此我们将创建大小正好为1千字节的测试文件。这样我们就可以验证Nginx是否在应该压缩的地方使用了压缩,压缩了一种类型的文件,而没有压缩其他类型的文件。

使用 truncate 在 Nginx 默认目录下创建一个 1 千字节的文件,名为 test.html。扩展名表示这是一个 HTML 页面。

1sudo truncate -s 1k /usr/share/nginx/html/test.html

让我们以同样的方式再创建几个测试文件:一个 jpg 图像文件、一个 css 样式表和一个 js JavaScript 文件。

1sudo truncate -s 1k /usr/share/nginx/html/test.jpg
2sudo truncate -s 1k /usr/share/nginx/html/test.css
3sudo truncate -s 1k /usr/share/nginx/html/test.js

第 2 步 - 检查默认行为

下一步是检查 Nginx 在新安装时如何使用我们刚刚创建的文件进行压缩。

让我们检查名为 test.html 的 HTML 文件是否经过压缩。该命令从 Nginx 服务器请求一个文件,并使用 HTTP 标头("Accept-Encoding: gzip")指定可以提供 "gzip "压缩内容。

1curl -H "Accept-Encoding: gzip" -I http://localhost/test.html

对此,您应该会看到几个 HTTP 响应头:

 1[label Nginx response headers]
 2HTTP/1.1 200 OK
 3Server: nginx/1.6.3
 4Date: Fri, 11 Mar 2016 12:53:06 GMT
 5Content-Type: text/html
 6Content-Length: 1024
 7Last-Modified: Fri, 11 Mar 2016 12:48:02 GMT
 8Connection: keep-alive
 9ETag: "56e2be82-400"
10Accept-Ranges: bytes

在响应中,根本没有提到 gzip。这说明服务器上未启用gzip压缩。这是因为在 CentOS 7 上,Nginx 的默认配置完全禁用了对 gzip 的支持。如果启用了压缩,我们就会在输出中看到额外的头信息 "Content-Encoding: gzip"。

在新安装的系统中,不仅 HTML 网页,所有其他文件都将以未压缩的方式提供。要验证这一点,可以用同样的方法请求名为 test.jpg 的测试图片。

1curl -H "Accept-Encoding: gzip" -I http://localhost/test.jpg

结果应与之前的基本相同:

 1[label Nginx response headers]
 2HTTP/1.1 200 OK
 3Server: nginx/1.6.3
 4Date: Fri, 11 Mar 2016 12:58:03 GMT
 5Content-Type: image/jpeg
 6Content-Length: 1024
 7Last-Modified: Fri, 11 Mar 2016 12:48:05 GMT
 8Connection: keep-alive
 9ETag: "56e2be85-400"
10Accept-Ranges: bytes

输出中也没有 "Content-Encoding: gzip "标头,这意味着文件是在未压缩的情况下提供的。

您可以使用测试 CSS 样式表重复该测试。

1curl -H "Accept-Encoding: gzip" -I http://localhost/test.css

同样,输出中也没有提到压缩。

 1[label Nginx response headers for CSS file]
 2HTTP/1.1 200 OK
 3Server: nginx/1.6.3
 4Date: Fri, 11 Mar 2016 12:59:04 GMT
 5Content-Type: text/css
 6Content-Length: 1024
 7Last-Modified: Fri, 11 Mar 2016 12:48:05 GMT
 8Connection: keep-alive
 9ETag: "56e2be85-400"
10Accept-Ranges: bytes

第 3 步 - 启用和配置 Nginx 的 gzip 模块

下一步是配置 Nginx,使其能对所有可受益于压缩的文件格式进行压缩。

gzip "模块是Nginx的核心模块,这意味着它已经安装,但必须启用和配置。 在 CentOS 7 上全新安装 Nginx 时,会自动加载 /etc/nginx/conf.d 目录中所有以 .conf 为扩展名的文件。这样就可以轻松配置其他模块。

要启用 Nginx gzip 模块,请使用 nano 或最喜欢的文本编辑器创建名为 gzip.conf 的配置文件。

1sudo nano /etc/nginx/conf.d/gzip.conf

粘贴以下内容。

 1[label /etc/nginx/conf.d/gzip.conf]
 2##
 3# `gzip` Settings
 4#
 5#
 6gzip on;
 7gzip_disable "msie6";
 8
 9gzip_vary on;
10gzip_proxied any;
11gzip_comp_level 6;
12gzip_http_version 1.1;
13gzip_min_length 256;
14gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon;

保存并关闭文件退出。

让我们来看看这里应用的配置设置:

  • gzip on 指令启用 Gzip 压缩。
  • gzip_disable "msie6" 将 Internet Explorer 6 排除在接收压缩文件的浏览器之外,因为 IE6 完全不支持 gzip
  • gzip_varygzip_proxied 设置可确保浏览器和服务器之间的代理服务器能正确识别压缩文件。
  • gzip_comp_level 6 设置文件压缩的程度。数字越大,压缩级别越高,资源使用量也越大。6 是一个合理的中间值。
  • gzip_http_version 1.1 用于将 gzip 压缩限制在支持 HTTP/1.1 协议的浏览器上。如果浏览器不支持该协议,就很有可能也不支持 gzip
  • gzip_min_length 256告诉Nginx不要压缩小于256字节的文件。非常小的文件几乎无法从压缩中受益。
  • gzip_types 列出将被压缩的所有 MIME 类型。在本例中,该列表包括 HTML 页面、CSS 样式表、Javascript 和 JSON 文件、XML 文件、图标、SVG 图像和网络字体。

要启用新配置,请重启 Nginx。

1sudo systemctl restart nginx

第 4 步 - 验证新配置

下一步是检查配置更改是否达到预期效果。

我们可以像步骤 2 一样,在每个测试文件上使用 curl,并检查 Content-Encoding: gzip 标头的输出,来测试这一点。

1curl -H "Accept-Encoding: gzip" -I http://localhost/test.html

在响应中,您应该会看到之前没有的 Content-Encoding: gzip 标头:

1[label Nginx response headers]
2HTTP/1.1 200 OK
3Server: nginx/1.6.3
4Date: Fri, 11 Mar 2016 13:19:16 GMT
5Content-Type: text/html
6Last-Modified: Fri, 11 Mar 2016 12:48:02 GMT
7Connection: keep-alive
8Vary: Accept-Encoding
9Content-Encoding: gzip

您可以用同样的方法测试所有其他文件:

1curl -H "Accept-Encoding: gzip" -I http://localhost/test.jpg
2curl -H "Accept-Encoding: gzip" -I http://localhost/test.css
3curl -H "Accept-Encoding: gzip" -I http://localhost/test.js

现在只有图片文件 test.jpg 应保持未压缩状态。在其他两个示例中,你应该能在输出中找到 Content-Encoding: gzip 标头。

如果是这种情况,那么您已经在 Nginx 中成功配置了 gzip 压缩!

结论

更改 Nginx 配置以完全使用 "gzip "压缩很容易,但好处却是巨大的。不仅带宽有限的访问者可以更快地访问网站,谷歌也会对网站加载速度更快感到高兴。作为现代网络的重要组成部分,速度正日益受到重视,而使用 gzip 就是改善速度的一大举措。

Published At
Categories with 技术
comments powered by Disqus