简介
网站加载速度取决于浏览器需要下载的文件大小。减小传输文件的大小不仅可以加快网站加载速度,还可以减少需要支付带宽费用的用户的成本。
gzip
是一款流行的数据压缩程序。您可以配置 Nginx 使用 gzip
对其提供的文件进行实时压缩。这些文件在传输到浏览器时会被支持的浏览器解压缩,不会有任何损失,但可以减少 Web 服务器和浏览器之间传输的数据量。
由于压缩的工作原理以及 gzip
的工作方式,某些文件比其他文件更容易压缩。例如,文本文件通常可以压缩得非常小,最终大小通常会减小两倍以上。另一方面,像 JPEG 或 PNG 文件这样的图像已经通过其自身的压缩方式进行了压缩,再次使用 gzip
进行压缩几乎不会产生任何效果。压缩文件会占用服务器资源,因此最好只压缩那些在结果中可以显著减小大小的文件。
在本指南中,我们将讨论如何配置安装在 Ubuntu 14.04 服务器上的 Nginx,以利用 gzip
压缩来减小发送给网站访问者的内容大小。
先决条件
要按照本教程操作,您需要:
- 一个具有 sudo 非根用户的 Ubuntu 14.04 服务器
- 已按照《在 Ubuntu 14.04 上安装 Nginx》教程在服务器上安装了 Nginx
步骤 1 —— 创建测试文件
在这一步中,我们将在默认的 Nginx 目录中创建几个测试文件,以测试 gzip
的压缩效果。
为了决定通过网络传输哪种类型的文件,Nginx 不会分析文件内容,因为这样做速度不够快。相反,它只会查找文件扩展名来确定其 MIME 类型,这表示文件的用途。
由于这种行为,测试文件的内容是无关紧要的。通过适当命名文件,我们可以欺骗 Nginx,使其认为一个完全空的文件是图像,另一个文件是样式表,等等。
在我们的配置中,Nginx 不会压缩非常小的文件,因此我们将创建确切大小为 1 千字节的测试文件。这将使我们能够验证 Nginx 是否在应该压缩的地方使用了压缩,对一种类型的文件进行压缩,而对其他类型的文件不进行压缩。
使用 truncate
命令在默认的 Nginx 目录中创建名为 test.html
的 1 千字节文件。扩展名表示它是一个 HTML 页面。
sudo truncate -s 1k /usr/share/nginx/html/test.html
让我们以相同的方式创建更多的测试文件:一个 jpg
图像文件,一个 css
样式表,和一个 js
JavaScript 文件。
sudo truncate -s 1k /usr/share/nginx/html/test.jpg sudo truncate -s 1k /usr/share/nginx/html/test.css sudo truncate -s 1k /usr/share/nginx/html/test.js
步骤 2 —— 检查默认行为
下一步是检查 Nginx 在新安装中对压缩的行为,以及我们刚刚创建的文件。
让我们检查 HTML 文件 test.html
是否使用压缩进行服务。该命令请求从我们的 Nginx 服务器获取文件,并指定可以通过使用 HTTP 头 (Accept-Encoding: gzip
) 来提供 gzip
压缩内容。
curl -H "Accept-Encoding: gzip" -I http://localhost/test.html
作为响应,您应该看到几个 HTTP 响应头:
HTTP/1.1 200 OK Server: nginx/1.4.6 (Ubuntu) Date: Tue, 19 Jan 2016 20:04:12 GMT Content-Type: text/html Last-Modified: Tue, 04 Mar 2014 11:46:45 GMT Connection: keep-alive Content-Encoding: gzip
在最后一行,您可以看到 Content-Encoding: gzip
头。这告诉我们该文件已使用 gzip
压缩发送。这是因为在 Ubuntu 14.04 上,Nginx 在默认设置下安装后会自动启用 gzip
压缩。
但是,默认情况下,Nginx 只会压缩 HTML 文件。在新安装中,其他每个文件都将以未压缩的方式提供。为了验证这一点,您可以以相同的方式请求我们的测试图像 test.jpg
。
curl -H "Accept-Encoding: gzip" -I http://localhost/test.jpg
结果应该与之前略有不同:
HTTP/1.1 200 OK Server: nginx/1.4.6 (Ubuntu) Date: Tue, 19 Jan 2016 20:10:34 GMT Content-Type: image/jpeg Content-Length: 0 Last-Modified: Tue, 19 Jan 2016 20:06:22 GMT Connection: keep-alive ETag: "569e973e-0" Accept-Ranges: bytes
输出中没有 Content-Encoding: gzip
头,这意味着该文件未经压缩提供。
您可以以相同的方式重复测试样式表 test.css
。
curl -H "Accept-Encoding: gzip" -I http://localhost/test.css
再次,输出中没有提到压缩。
HTTP/1.1 200 OK Server: nginx/1.4.6 (Ubuntu) Date: Tue, 19 Jan 2016 20:20:33 GMT Content-Type: text/css Content-Length: 0 Last-Modified: Tue, 19 Jan 2016 20:20:33 GMT Connection: keep-alive ETag: "569e9a91-0" Accept-Ranges: bytes
步骤 3 — 配置 Nginx 的 gzip 设置
下一步是配置 Nginx 不仅提供压缩的 HTML 文件,还可以为其他可以受益于压缩的文件格式提供服务。
要更改 Nginx 的 gzip
配置,请打开主 Nginx 配置文件,使用 nano
或您喜欢的文本编辑器。
sudo nano /etc/nginx/nginx.conf
找到 gzip
设置部分,看起来像这样:
. . . ## # `gzip` 设置 # # gzip on; gzip_disable "msie6"; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; . . .
您可以看到,默认情况下,gzip
压缩是通过 gzip on
指令启用的,但是其他几个附加设置都被注释掉了,使用了 #
注释符。我们将对此部分进行几处更改:
- 通过取消注释所有被注释的行(即删除行首的
#
)来启用附加设置 - 添加
gzip_min_length 256;
指令,告诉 Nginx 不要压缩小于 256 字节的文件。这是因为非常小的文件几乎不受压缩的好处。 - 在
gzip_types
指令后附加其他文件类型,包括 web 字体、ico
图标和 SVG 图像。
应用这些更改后,设置部分应如下所示:
. . . ## # `gzip` 设置 # # gzip on; gzip_disable "msie6"; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_buffers 16 8k; gzip_http_version 1.1; gzip_min_length 256; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon; . . .
保存并关闭文件以退出。
要启用新配置,请重新启动 Nginx。
sudo service nginx restart
步骤 4 — 验证新配置
下一步是检查配置更改是否按预期工作。
我们可以像在步骤 2 中一样进行测试,通过在每个测试文件上使用 curl
并检查输出中的 Content-Encoding: gzip
标头来进行测试。
curl -H "Accept-Encoding: gzip" -I http://localhost/test.html curl -H "Accept-Encoding: gzip" -I http://localhost/test.jpg curl -H "Accept-Encoding: gzip" -I http://localhost/test.css curl -H "Accept-Encoding: gzip" -I http://localhost/test.js
现在只有 test.jpg
,即图像文件,应保持未压缩状态。在所有其他示例中,您应该能够在输出中找到 Content-Encoding: gzip
标头。
如果是这种情况,您已成功配置了 Nginx 中的 gzip
压缩!
结论
更改 Nginx 配置以充分利用 gzip
压缩很容易,但好处可能是巨大的。不仅带宽有限的访问者将更快地接收网站,Google 也会因网站加载更快而感到高兴。速度正在成为现代网络的重要组成部分,而使用 gzip
是改进速度的一大步。