如何在Ubuntu 14.04上将gzip模块添加到Nginx

网站加载的速度取决于浏览器下载的所有文件的大小。减少要传输的文件的大小不仅可以使网站加载速度更快,而且对那些必须为带宽使用付费的人来说更便宜。

gzip是一种流行的数据压缩程序。您可以将Nginx配置为使用gzip压缩它正在运行的文件。然后,这些文件在检索时被支持它的浏览器解压,没有任何损失,但是在web服务器和浏览器之间传输的数据量更小。

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

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

先决条件

要学习本教程,您需要:

  • 一个带有sudo非root用户的 Ubuntu 14.04服务器,没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后在购买服务器
  • 在服务器上安装Nginx

第1步 - 创建测试文件

在这一步中,我们将在默认的Nginx目录中创建几个测试文件来进行文本gzip压缩。

为了决定通过网络提供什么样的文件,Nginx不会分析文件内容,因为它不够快。相反,它只是查找文件扩展名以确定其MIME类型,MIME类型表示文件的用途。

由于这种行为,测试文件的内容是不相关的。通过适当地命名文件,我们可以诱使Nginx认为一个完全空的文件是一个图像,另一个是一个样式表。

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

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

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

让我们以相同的方式创建一些测试文件:一个jpg图像文件,一个css样式表和一个jsJavaScript文件。

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在使用我们刚刚创建的文件压缩新安装时的行为。

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

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

作为响应,您应该看到几个HTTP响应标头:

Nginx响应头

HTTP/1.1 200 OK
Server: nginx/1.4.6 (CentOS)
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压缩已用于发送此文件。这是因为在CentOS服务器上,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 (CentOS)
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的标题,这意味着文件是在没有压缩的情况下提供的。

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

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

再一次,输出中没有提到压缩。

HTTP/1.1 200 OK
Server: nginx/1.4.6 (CentOS)
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配置,请在 nano或其他您喜欢的文本编辑器中打开主要的Nginx配置文件。

sudo nano /etc/nginx/nginx.conf

找到gzip设置部分,如下所示:

. . .
##
# `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压缩是由gzip on指令启用的,但是有几个附加的设置是用#注释符号注释的。我们将对此部分进行一些更改:

  • 通过取消注释所有注释行来启用其他设置(即,通过删除#行的开头)
  • 添加该gzip_min_length 256;指令,告诉Nginx不要压缩小于256字节的文件。这是非常小的文件,几乎不能从压缩中获益。
  • 在gzip_types指令后面附加额外的文件类型,这些文件类型表示web字体,ico图标和SVG图像。

应用这些更改后,设置部分应如下所示:

. . .
##
# `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 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中所做的那样,对每个测试文件使用curll并检查内容编码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的应用会是改进它的一大步。

更多Ubuntu教程请前往腾讯云+社区学习更多知识。


参考文献:《 How To Add the gzip Module to Nginx on Ubuntu 14.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Pythonista

Http协议

HTTP(hypertext transport protocol),即超文本传输协议。这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。

1801
来自专栏CSDN技术头条

浏览器缓存机制剖析

“缓存一直是前端优化的主战场,利用好缓存就成功了一半。本篇从HTTP请求和响应的头域入手,让你对浏览器缓存有个整体的概念。最终你会发现强缓存,协商缓存 和 启发...

2466
来自专栏IT笔记

Nginx学习之缓存配置

项目采用的是Nginx+Tomcat,Nginx处理静态请求并缓存,Tomcat处理动态请求。 缓存配置proxy_cache.conf: #设置Web缓存区名...

3057
来自专栏developerHaoz 的安卓之旅

程序员都该懂点 HTTP

HTTP 全称是 HyperText Transfer Protocal ,即:超文本传输协议,从 1990 年开始就在 WWW 上广泛应用,是现今在 WWW ...

893
来自专栏Java后端技术

[转]阿里巴巴数据库连接池 druid配置详解

  java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池。数据库连接池有很多选择,c3p、dhcp、proxool等,dr...

5663
来自专栏测试开发架构之路

命令行窗口中用telnet测试HTTP协议

1. 命令行窗口中用telnet测试HTTP协议  HTTP消息是由普通ASCII文本组成。消息包括消息头和数据体部分。消息头以行为单位,每行以CRLF(回车和...

4319
来自专栏互联网技术栈

Redis 队列

举例: 队列主要用在系统解耦、流量削峰、异步处理、数据顺序处理等场景。新手在使用时可能会犯一些常见的错误。下面讲一个新手容易犯的错误,在这个示例中把队列的入...

4825
来自专栏Java后端技术

GitLab配置ssh key

  当前很多公司都选择git作为代码版本控制工具,然后自己公司搭建私有的gitlab来管理代码,我们在clone代码的时候可以选择http协议,当然我们亦可以选...

1183
来自专栏码匠的流水账

修复zuul跨域配置异常

多次请求的时候,会把这些header再带过来,然后请求zuul转发的接口又在写入一次,造成重复了,方案就是zuul转发的时候,过滤掉这些header,比如

1512
来自专栏Java架构师历程

数据库连接池

官方:数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,...

3582

扫码关注云+社区

领取腾讯云代金券