作者选择了 COVID-19 救援基金作为 Write for Donations计划的一部分接受捐款。
介绍
网站的性能部分取决于用户浏览器必须下载的所有文件的大小。减少这些传输的文件的大小可以使您的网站更快。
gzip
是一个流行的数据压缩程序. 您可以配置 Nginx 以使用 gzip
来压缩它在飞行中服务的文件. 然后这些文件由支持它时恢复的浏览器解压缩,而没有任何损失,但在网页服务器和浏览器之间传输的数据量较小的好处。 好消息是,压缩支持在所有主要浏览器中普遍存在,没有理由不使用它。
例如,文本文件压缩得非常好,往往结局大于两倍。另一方面,像JPEG或PNG文件这样的图像已经被压缩了,使用gzip的第二次压缩结果很少或没有结果。
在本教程中,您将配置 Nginx 以使用gzip
压缩,从而减少向您的网站访问者发送的内容的大小,并提高性能。
前提条件
要遵循本教程,您将需要:
- 一个Ubuntu 20.04服务器与一个正常的,非根用户与sudo特权. 你可以学习如何通过遵循这个 初始服务器设置教程来准备你的服务器。
- Nginx 安装在你的服务器上,通过遵循我们的教程, 如何在Ubuntu 20.04上安装 Nginx.
步骤 1 - 创建测试文件
在此步骤中,我们将在默认的 Nginx 目录中创建几个测试文件,我们将使用这些文件后面检查 Nginx 的默认行为以检测 gzip
的压缩,并测试配置更改是否具有预期的效果。
要推断在网络上提供什么类型的文件, Nginx 不会分析文件内容;这将是非常慢的;相反,它会查看文件扩展,以确定文件的 _MIME 类型,这表示其目的。
由于这种行为,我们的测试文件的内容是无关紧要的. 通过正确命名文件,我们可以欺骗 Nginx 认为,例如,一个完全空的文件是一个图像,另一个是风格表。
在默认的 Nginx 目录中使用truncate
创建名为test.html
的文件,此扩展表示它是一个 HTML 页面:
1sudo truncate -s 1k /var/www/html/test.html
让我们以同样的方式创建几个测试文件:一个jpg
图像文件,一个css
样式表和一个js
JavaScript文件:
1sudo truncate -s 1k /var/www/html/test.jpg
2sudo truncate -s 1k /var/www/html/test.css
3sudo truncate -s 1k /var/www/html/test.js
下一步是检查 Nginx 如何在新安装中压缩我们刚刚创建的文件的请求文件。
步骤2 - 检查默认行为
让我们检查一下名为 test.html
的 HTML 文件是否配备了压缩,该命令要求我们的 Nginx 服务器提供一个文件,并指定使用 HTTP 标题( Accept-Encoding: gzip
)提供 gzip
压缩的内容是否正常:
1curl -H "Accept-Encoding: gzip" -I http://localhost/test.html
作为回应,您应该看到几个HTTP响应标题:
1[secondary_label Output]
2HTTP/1.1 200 OK
3Server: nginx/1.18.0 (Ubuntu)
4Date: Tue, 09 Feb 2021 19:04:25 GMT
5Content-Type: text/html
6Last-Modified: Tue, 09 Feb 2021 19:03:41 GMT
7Connection: keep-alive
8ETag: W/"6022dc8d-400"
9Content-Encoding: gzip
在最后一行中,你可以看到内容编码:gzip
标题,这告诉我们gzip
压缩是用来发送这个文件的。
但是,默认情况下, Nginx 只压缩 HTML 文件. 所有其他文件都将不压缩,这不如最佳。 为了验证这一点,您可以以相同的方式请求我们的测试图像名为 test.jpg
:
1curl -H "Accept-Encoding: gzip" -I http://localhost/test.jpg
结果应该与以前略有不同:
1[secondary_label Output]
2HTTP/1.1 200 OK
3Server: nginx/1.18.0 (Ubuntu)
4Date: Tue, 09 Feb 2021 19:05:49 GMT
5Content-Type: image/jpeg
6Content-Length: 1024
7Last-Modified: Tue, 09 Feb 2021 19:03:45 GMT
8Connection: keep-alive
9ETag: "6022dc91-400"
10Accept-Ranges: bytes
输出中没有内容编码:gzip
标题,这意味着该文件没有任何压缩。
您可以使用测试 CSS 样式表重复测试:
1curl -H "Accept-Encoding: gzip" -I http://localhost/test.css
再次,输出中没有提到压缩:
1[secondary_label Output]
2HTTP/1.1 200 OK
3Server: nginx/1.18.0 (Ubuntu)
4Date: Tue, 09 Feb 2021 19:06:04 GMT
5Content-Type: text/css
6Content-Length: 1024
7Last-Modified: Tue, 09 Feb 2021 19:03:45 GMT
8Connection: keep-alive
9ETag: "6022dc91-400"
10Accept-Ranges: bytes
在下一步,我们会告诉 Nginx 压缩所有类型的文件,这些文件将从使用gzip
中受益。
步骤 3 — 配置 Nginx 的gzip
设置
若要更改 Nginx 'gzip' 配置,请在 'nano' 或您最喜欢的文本编辑器中打开主要的 Nginx 配置文件:
1sudo nano /etc/nginx/nginx.conf
找到gzip
设置部分,它看起来像这样:
1[label /etc/nginx/nginx.conf]
2. . .
3##
4# `gzip` Settings
5#
6#
7gzip on;
8gzip_disable "msie6";
9
10# gzip_vary on;
11# gzip_proxied any;
12# gzip_comp_level 6;
13# gzip_buffers 16 8k;
14# gzip_http_version 1.1;
15# gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
16. . .
您可以看到gzip
压缩确实被gzip on
指令启用,但一些额外的设置被评论为#
标志,并且没有效果。
- 啟用附加設定,不評論所有評論的行(即,在行開始時刪除「#」)
- 添加「gzip_min_length 256;」指令,指示 Nginx 不要壓縮小於 256 字節的檔案。
应用这些更改后,设置部分应该是这样的:
1[label /etc/nginx/nginx.conf]
2. . .
3##
4# `gzip` Settings
5#
6#
7gzip on;
8gzip_disable "msie6";
9
10gzip_vary on;
11gzip_proxied any;
12gzip_comp_level 6;
13gzip_buffers 16 8k;
14gzip_http_version 1.1;
15gzip_min_length 256;
16gzip_types
17 application/atom+xml
18 application/geo+json
19 application/javascript
20 application/x-javascript
21 application/json
22 application/ld+json
23 application/manifest+json
24 application/rdf+xml
25 application/rss+xml
26 application/xhtml+xml
27 application/xml
28 font/eot
29 font/otf
30 font/ttf
31 image/svg+xml
32 text/css
33 text/javascript
34 text/plain
35 text/xml;
36. . .
保存并关闭文件以退出。
要启用新的配置,请重新启动 Nginx:
1sudo systemctl restart nginx
接下来,让我们确保我们的新配置工作。
步骤 4 – 验证新配置
执行与之前的测试 HTML 文件相同的请求:
1curl -H "Accept-Encoding: gzip" -I http://localhost/test.html
答案将保持相同,因为该文件类型已经启用了压缩:
1[secondary_label Output]
2HTTP/1.1 200 OK
3Server: nginx/1.18.0 (Ubuntu)
4Date: Tue, 09 Feb 2021 19:04:25 GMT
5Content-Type: text/html
6Last-Modified: Tue, 09 Feb 2021 19:03:41 GMT
7Connection: keep-alive
8ETag: W/"6022dc8d-400"
9Content-Encoding: gzip
但是,如果我们要求以前未压缩的 CSS 样式表,答案将是不同的:
1curl -H "Accept-Encoding: gzip" -I http://localhost/test.css
现在gzip
正在压缩文件:
1[secondary_label Output]
2HTTP/1.1 200 OK
3Server: nginx/1.18.0 (Ubuntu)
4Date: Tue, 09 Feb 2021 19:21:54 GMT
5Content-Type: text/css
6Last-Modified: Tue, 09 Feb 2021 19:03:45 GMT
7Connection: keep-alive
8Vary: Accept-Encoding
9ETag: W/"6022dc91-400"
10Content-Encoding: gzip
在第一步创建的所有测试文件中,只有test.jpg
图像文件才能保持不压缩。
1curl -H "Accept-Encoding: gzip" -I http://localhost/test.jpg
没有gzip
压缩:
1[secondary_label Output]
2HTTP/1.1 200 OK
3Server: nginx/1.18.0 (Ubuntu)
4Date: Tue, 09 Feb 2021 19:25:40 GMT
5Content-Type: image/jpeg
6Content-Length: 1024
7Last-Modified: Tue, 09 Feb 2021 19:03:45 GMT
8Connection: keep-alive
9ETag: "6022dc91-400"
10Accept-Ranges: bytes
在这里,内容编码:gzip
标题在输出中不如预期。
如果是这样,则您在 Nginx 中成功配置了gzip
压缩。
结论
更改 Nginx 配置以使用gzip
压缩很容易,但这些好处可以是巨大的. 不仅限带宽的访问者会更快地接收网站,但所有其他用户也会看到显著的速度增长。 搜索引擎也会对网站加载速度更快感到高兴。 加载速度现在是搜索引擎排名网站的关键指标,使用gzip
是改进它的一大步。