网站的加载速度,与用户浏览器要下载的文件的大小密切相关。减小网站要传输文件的大小,可以提升网站的加载速度。
gzip
是一种流行的数据压缩方法。我们可以配置 Nginx 以启用gzip
压缩,进而压缩网站文件的大小。由于gzip
压缩方式原因,某些类型的文件比其他类型文件的压缩效果更好。例如,文本文件压缩得非常好,通常会缩小两倍以上。然而,对于 JPEG 或 PNG 等图像文件,Gzip 的压缩效果并不十分明显。
在本文中,我们将介绍 Nginx 如何体用gzip
压缩。
第 1 步 – 创建测试文件
在这一步中,我们将在默认的 Nginx 目录中创建几个测试文件。稍后我们将使用这些文件来检查 Nginx 的gzip
压缩效果。
使用truncate
在 Nginx 目录中创建一个名为test.html
的文件。这个扩展名表示它是一个 HTML 页面:
sudo truncate -s 1k /var/www/html/test.html
我们以相同的方式再创建几个测试文件:一个jpg
图像文件、一个css
样式表和一个js
JavaScript 文件:
sudo truncate -s 1k /var/www/html/test.jpg
sudo truncate -s 1k /var/www/html/test.css
sudo truncate -s 1k /var/www/html/test.js
第 2 步 — 检查默认行为
让我们检查一下名为test.htm
的 HTML 文件是否经过压缩。使用下面的命令从我们的 Nginx 服务器请求一个文件,并通过 HTTP 标头 ( Accept-Encoding: gzip
)指定以gzip
进行压缩:
curl -H "Accept-Encoding: gzip" -I http://localhost/test.html
作为响应,应该会看到下面的几个 HTTP 响应标头:
Output
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Tue, 09 Feb 2021 19:04:25 GMT
Content-Type: text/html
Last-Modified: Tue, 09 Feb 2021 19:03:41 GMT
Connection: keep-alive
ETag: W/"6022dc8d-400"
Content-Encoding: gzip
在最后一行,您可以看到Content-Encoding: gzip
的响应头。这告诉我们在发送这个文件时启用了gzip
压缩。
默认情况下,Nginx 只压缩 HTML 文件。其他所有文件都将以未压缩的形式提供。为了验证这一点,您可以请求名为test.jpg
的测试图像:
curl -H "Accept-Encoding: gzip" -I http://localhost/test.jpg
结果应该与以前面略有不同:
Output
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Tue, 09 Feb 2021 19:05:49 GMT
Content-Type: image/jpeg
Content-Length: 1024
Last-Modified: Tue, 09 Feb 2021 19:03:45 GMT
Connection: keep-alive
ETag: "6022dc91-400"
Accept-Ranges: bytes
输出中没有Content-Encoding: gzip
响应头,这意味着该文件没有进行任何压缩。
还可以继续测试 CSS 样式表文件:
curl -H "Accept-Encoding: gzip" -I http://localhost/test.css
从响应头可以看出,CSS 文件同样没有进行压缩:
Output
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Tue, 09 Feb 2021 19:06:04 GMT
Content-Type: text/css
Content-Length: 1024
Last-Modified: Tue, 09 Feb 2021 19:03:45 GMT
Connection: keep-alive
ETag: "6022dc91-400"
Accept-Ranges: bytes
在下一步中,我们将进行配置和启用GZIP压缩。
第 3 步 — 配置 Nginx 的gzip
设置
要启用 Nginx gzip
配置,请使用nano
或者任意的文本编辑器中打开主 Nginx 配置文件:
sudo nano /etc/nginx/nginx.conf
找到gzip
设置部分,如下所示:
/etc/nginx/nginx.conf
. . .
##
# `gzip` Settings
#
#
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 on
指令,这说明已经启用了gzip
压缩,但是有几个附加指令用#
符号注释掉了。我们将对其进行一些更改:
- 通过删除对应注释行前面的
#
,来取消相关指令的注释。 - 添加
gzip_min_length 256;
指令,告诉 Nginx 不要压缩小于 256 字节的文件。因为非常小的文件压缩也没什么效果。 - 在
gzip_types
指令中附加 Web 字体、图标、XML 提要、JSON 结构化数据和 SVG 图像的其他文件类型。
更改完成后,设置部分应如下所示:
/etc/nginx/nginx.conf
. . .
##
# `gzip` Settings
#
#
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
application/atom+xml
application/geo+json
application/javascript
application/x-javascript
application/json
application/ld+json
application/manifest+json
application/rdf+xml
application/rss+xml
application/xhtml+xml
application/xml
font/eot
font/otf
font/ttf
image/svg+xml
text/css
text/javascript
text/plain
text/xml;
. . .
保存并关闭文件。
要应用新配置,需要重启 Nginx:
sudo systemctl restart nginx
接下来,让我们看看新配置是否有效。
第 4 步 — 验证新配置
执行下面的命令测试 HTML 文件:
curl -H "Accept-Encoding: gzip" -I http://localhost/test.html
该文件类型已启用压缩,因此响应将和前次相同:
Output
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Tue, 09 Feb 2021 19:04:25 GMT
Content-Type: text/html
Last-Modified: Tue, 09 Feb 2021 19:03:41 GMT
Connection: keep-alive
ETag: W/"6022dc8d-400"
Content-Encoding: gzip
然后,我们请求之前未压缩的 CSS 样式表,来看看 CSS 文件是否被压缩:
curl -H "Accept-Encoding: gzip" -I http://localhost/test.css
从响应头可以看出,CSS 文件已进行gzip
压缩:
Output
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Tue, 09 Feb 2021 19:21:54 GMT
Content-Type: text/css
Last-Modified: Tue, 09 Feb 2021 19:03:45 GMT
Connection: keep-alive
Vary: Accept-Encoding
ETag: W/"6022dc91-400"
Content-Encoding: gzip
在第1步中创建的所有测试文件中,只有test.jpg
图像文件处于未压缩状态。我们可以用同样的方法来测试:
curl -H "Accept-Encoding: gzip" -I http://localhost/test.jpg
会发现图像文件没有被gzip
压缩:
Output
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Tue, 09 Feb 2021 19:25:40 GMT
Content-Type: image/jpeg
Content-Length: 1024
Last-Modified: Tue, 09 Feb 2021 19:03:45 GMT
Connection: keep-alive
ETag: "6022dc91-400"
Accept-Ranges: bytes
因为 Gzip 对图像的压缩效果并不好,所以我们也无需为图像开启 Gzip 压缩。
总结
综上,牛奇网介绍了如何为 Nginx 开启 Gzip 压缩。Gzip 对于文本文件的压缩效果非常好,但是对于图像文件的压缩非常有限。
作者:牛奇网,本站文章均为辛苦原创,在此严正声明,本站内容严禁采集转载,面斥不雅请好自为之,本文网址:https://www.niuqi360.com/linux/nginx-enable-gzip-and-improve-website-performance/