简介
网站的加载速度取决于浏览器需要下载的所有文件的大小。减小需要传输的文件大小不仅能加快网站的加载速度,还能降低带宽使用费用。
gzip
是一个流行的数据压缩程序。你可以配置 Nginx 使用 gzip
来即时压缩它提供的文件。然后,支持该程序的浏览器会在检索时解压缩这些文件,不会造成任何损失,但网络服务器和浏览器之间传输的数据量会减少。
由于压缩的一般工作方式以及 gzip
的工作方式,某些文件比其他文件压缩得更好。例如,文本文件的压缩效果非常好,通常压缩后的文件体积会缩小两倍以上。另一方面,JPEG 或 PNG 等图像文件本质上已经压缩,使用 gzip
进行二次压缩几乎不会产生任何效果。压缩文件会占用服务器资源,因此最好只压缩那些能显著减小文件大小的文件。
在本指南中,我们将讨论如何配置安装在 CentOS 7 服务器上的 Nginx,以利用 gzip
压缩技术减小发送给网站访问者的内容大小。
先决条件
要学习本教程,您需要
- 一台带有[sudo 非 root 用户]的 CentOS 7 服务器(https://andsky.com/tech/tutorials/initial-server-setup-with-centos-7)
- 按照如何在 CentOS 7 上安装 Nginx 教程 在服务器上安装 Nginx。
步骤 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_vary
和gzip_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
就是改善速度的一大举措。