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

简介

网站加载速度取决于浏览器需要下载的文件大小。减小传输文件的大小不仅可以加快网站加载速度,还可以减少需要支付带宽费用的用户的成本。

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 是改进速度的一大步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/793555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Python实现逻辑回归模型

逻辑回归是一种用于解决分类问题的统计学方法,尤其适用于二分类问题。在本文中,我们将使用Python来实现一个基本的逻辑回归模型,并介绍其原理和实现过程。 什么是逻辑回归? 逻辑回归是一种用于建立因变量与自变量之间关系的统计…

LabVIEW工程师在工作中需要特别注意哪些细节?

LabVIEW是一种图形编程语言,由美国国家仪器(National Instruments,简称NI)开发,广泛用于数据采集、仪器控制和工业自动化领域。LabVIEW工程师在工作中需要注意的细节颇多,既包括技术层面的,也包…

【Git】命令行使用体验大大优化的方法

Git的优化使用 相信很多人,在使用git作为版本管理工具时都会感受到它的方便,但是也会有一些问题困扰着我们,让我们觉得使用体验不是很好。我在使用git的过程中就发现了几个问题:写commit费时、怎么做多人开发的代码审查等等。今天…

Vue3:组件间通信-provide和inject实现祖先组件与后代组件间直接通信

一、情景说明 我们学习了很多的组件间通信 这里在学习一种,祖先组件与后代组件间通信的技术 这里的后代,可以是多层继承关系,子组件,子子组件,子子子组件等等。 在祖先组件中通过provide配置向后代组件提供数据在后代…

设计模式:工厂模式和抽象工厂模式的区别

定义 工厂模式(Factory Pattern)通常指的是工厂方法模式(Factory Method Pattern),它定义了一个创建对象的方法,由子类决定要实例化的类。工厂方法让类的实例化推迟到子类。 抽象工厂模式(Abstract Factory Pattern)提供了一个接口,用于创建相关或依赖对象的家族,而…

设计模式:工厂模式

定义 工厂模式(Factory Pattern),特别是工厂方法模式(Factory Method Pattern),是一种创建型设计模式,它定义了一个创建对象的接口,但将实例化的类推迟到子类中进行。这样&#xff…

基于springboot+vue+Mysql的在线考试系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

mysql 从同一个表获取数据update自身报错一例

我在mysql中,想将一些记录的某个字段,改成跟某条记录的该字段的值一样,语句如下: update org_user set password(select password from org_user where loginnameadmin limit 1) where userid>1000;结果就报错了,提…

Linux操作系统之防火墙、redis安装

目录 一、防火墙 1、防火墙的类别 2、安装iptables(四表五链) 一、防火墙 1、防火墙的类别 安全产品 杀毒 针对病毒,特征篡改系统中文件杀毒软件针对处理病毒程序 防火墙 针对木马,特征系统窃密 防火墙针对处理木马 防火墙分为两种 硬件…

Codeforces Round 824 (Div. 2) D. Meta-set

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e18, maxm 4e4 5; c…

MXNet库

MXNet&#xff08;MatriX Network&#xff09;是一个开源的深度学习框架&#xff0c;最初由亚马逊公司开发并于2015年发布。它是一个高效、灵活且可扩展的框架&#xff0c;旨在支持大规模的分布式深度学习模型训练和部署。 以下是 MXNet 库的一些主要特点和组成部分&#xff1…

设计模式——工厂模式01

工厂模式 定义&#xff1a;工厂模式是创建子类实例化对象的一种方式&#xff0c;屏蔽了创造工厂的内部细节。把创建对象与使用对象进行拆分&#xff0c;满足单一职责。如果需要向工厂中添加新商品&#xff0c; 只需要扩展子类再重写其工厂方法&#xff0c;满足开闭原则。 设计…

01 计算机网络发展与分类

计算机网络&#xff1a;计算机技术与通信技术的结合。 阶段一&#xff1a;早期网络&#xff1a;ARPAnet。 阶段二&#xff1a;厂商独立发展阶段 阶段三&#xff1a;标准化阶段&#xff1a;ISO,TCP/IP 计算机网络分类 计算机网络分类1&#xff1a;通信子网和资源子网 通信子…

掌握ChatGPT技巧,写出拔尖学术论文

ChatGPT无限次数:点击直达 掌握ChatGPT技巧&#xff0c;写出拔尖学术论文 引言 在当今数字化时代&#xff0c;人工智能技术的发展对学术研究也产生了深远影响。其中&#xff0c;ChatGPT作为一种强大的自然语言处理工具&#xff0c;为学术界提供了全新的可能性。本文将介绍如何…

Android Binder——Java层介绍(三)

一、简介 对于 Android 系统,一般是从 java 层到 native 层,再到 kernel 驱动层,形成一个完整的软件架构。Android 系统中的 Binder IPC 通信机制的整体架构也是如此,Java 和 C++ 层都定义有同样功能的供应用程序使用的 Binder 接口。然而 Java 层中 Framework 层的 Servic…

第十一届能源与环境研究国际会议-可再生能源走向脱碳化(ICEER 2024)即将召开!

能源和环境是当今世界至关重要的研究和教育领域&#xff0c;持续的气候危机和对可持续发展战略的迫切需求&#xff0c;需要从能源科学到地球工程等广泛领域的变革性工程解决方案和创新。ICEER 2024为来自学术界&#xff0c;研究中心和全球工业界的工程师&#xff0c;研究人员和…

以太网布局指南

2层板 顶层走信号线以及地平面底层走信号线以及地平面信号走线应至少沿一条边被接地或接地走线包围如果使用地走线&#xff0c;应接本层接地平面&#xff0c;与上层接地平面解耦。 4层板 当信号走线被重新引用到功率平面时&#xff0c;在地平面和功率平面之间需要去耦电容器(0…

4月04日,每日信息差

&#x1f396; 素材来源官方媒体/网络新闻 &#x1f384; 地震预警App被曝收10元年费&#xff0c;回应称仅限苹果系统 &#x1f30d; 2024清明档首日票房破2亿 &#x1f30b; 浙江省杭州市余杭区设立2亿元网络微短剧发展基金 &#x1f381; 抖音拟以超 7.5 亿元收购海联金汇旗下…

Vue3 Ajax(axios)

Vue 版本推荐使用 axios 来完成 ajax 请求。 安装方法 使用 cdn: <script src"https://unpkg.com/axios/dist/axios.min.js"></script> 使用 npm: $ npm install axios GET 方法 我们可以简单的读取 JSON 数据&#xff1a; const app {data() {r…

蓝桥杯刷题 前缀和与差分-[2080]求和(C++)

题目描述 给定 n 个整数 a1, a2, , an &#xff0c;求它们两两相乘再相加的和&#xff0c;即 S a1 a2 a1 a3 a1 an a2 a3 an-2 an-1 an-2 an an-1 an 输入格式 输入的第一行包含一个整数 n 。 第二行包含 n 个整数 a1, a2, an。 输出格式 输…