Nginx静态资源传输优化,文件高效传输,事半功倍

news2024/12/26 23:47:37

1.引出问题

Nginx可以作为静态资源服务器,比如我们访问192.168.110.97:80,熟悉的nginx欢迎界面,这其实也是nginx为我们提供的一个静态文件:index.html

既然是静态资源,那我们能否优化一下传输效率呢?

1)sendfile文件高效传输模式。如何开启?它的原理到底是什么呢?

2)数据量大,传输效率低,如何进行优化?

2.sendfile高效传输

nginx.conf中配置sendfile on;指令就可以开启文件高效传输模式,那么它的原理是什么呢?

话不多说,走起。

sendfile的实现原理是通过调用内核提供的sendfile()调用来实现的。调用过程中,内核会将源文件的数据直接传输到socket中,而不需要将数据先拷贝到用户空间再进行传输。这样就可以避免数据在用户空间和内核空间之间的多次拷贝,从而提高了文件传输的效率。

既然是这样,那么普通传输模式和高效传输模式之间的区别就越发清晰了。

1)普通传输模式

发起文件读取命令–》读取文件到内核空间–》拷贝文件到用户空间–》拷贝文件到socket内核空间–》传输给socket

普通传输模式

2)高效传输模式

发起文件读取命令–》读取文件到内核空间–》拷贝文件到socket内核空间–》传输给socket

高效传输模式

3)小结

1)普通传输模式涉及到多次内核态与用户态之间的切换,这很消耗系统资源。

2)sendfile高效传输模式,直接在内核态进行数据传输,不涉及内核态与用户态之间的切换,传输效率大大提升。

3.gzip文件压缩

前面我们提到过,开启sendfile文件高效传输模式,可以提升传输的效率。其实,只做到这一步还是不够的,一旦文件的数据量较大,传输的速度又会大打折扣。

比如一部电影的大小是2G,下载时间很长,严重影响我们的观影体验,如果能够压缩到1G,那传输的时间就会减半。

Nginx为我们提供了gzip相关的模块,帮助实现对文件的压缩。

3.1 ngx_http_gzip_moudle

据nginx官方文档介绍,通过ngx_http_gzip_moudle提供的压缩功能,有助于将数据的大小减少一半甚至更多。👍

nginx已默认为我们安装该模块。接下来我们配置其指令。

1)配置是否开启gzip

作用域:http, server, location, if in location

语法:gzip on | off;

默认值gzip off;

2)配置gzip可压缩的响应类型

作用域:http, server, location

语法:gzip_types mime-type …;

默认值gzip_types text/html;

可以看到,我们可以配置多个mime-type,并且可以使用*匹配所有的mime-type。

🔔Tips:通常不会使用*进行匹配,如果所有的类型都开启压缩,如果本身静态资源的可压缩性不高,就会造成系统资源的浪费。

到这里,我们可以来体验一下开启gzip之后的压缩效果。

1)准备静态文件/usr/local/nginx/html/jquery.js

下载地址:https://code.jquery.com/jquery-3.6.4.js

2)增加location块

location /jquery {
	root   html;
}

访问http://192.168.110.98/jquery.js,查看文件大小:304kb

3)开启gzip

为了保持配置文件清爽,我们只对gzip压缩相关指令进行注释说明。

worker_processes  1;
gzip on;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        # 测试gzip压缩效果
        location /jquery {
        	# 配置可压缩的响应类型
        	gzip_types text/javascript;
            root   html;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

访问http://192.168.110.98/jquery.js,查看文件大小:107kb

3)配置gzip压缩级别

作用域:http, server, location

语法:gzip_comp_level level;

默认值gzip_comp_level 1;

🔔Tips:gzip默认压缩级别为1,可设置的值为1-9,值越高压缩程度越高,但是不一定值越高效果就越好,我们还是需要根据文件的可压缩性设置合适的压缩级别,否则也会造成系统资源的浪费。

4)配置根据User-Agent禁用gzip

作用域:http, server, location

语法:gzip_disable regex …;

作用:如果请求的User-Agent头信息与正则表达式匹配,则禁用gzip压缩功能

🔔Tips:User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 YaBrowser/23.3.4.594 Yowser/2.5 Safari/537.36,可以根据需要配置正则表达式。

5)配置gzip可压缩响应的最小长度

作用域:http, server, location

语法:gzip_min_length length;

默认值gzip_min_length 20;

🔔Tips:默认单位为byte,长度是由Content-Length响应头决定,如果长度低于设置的值,就关闭gzip压缩。建议设置为1kb以上。

6)gzip与sendfile的冲突问题

我们知道,开启sendfile文件高效传输模式,文件在内核空间直接传输给socket,不会经过用户程序,开启gzip之后,该模式也就失效了。那么怎么解决这个问题呢?

3.2 ngx_http_gzip_static_module

前面提到的gzip与sendfile的冲突问题,我们可以通过引入ngx_http_gzip_static_module模块来进行解决。该模块允许发送文件扩展名为.gz的预压缩文件。

🔔Tips:nginx默认不会添加该模块,需要我们自行引入。

配置指令:

作用域:http, server, location

语法:gzip_static on | off | always;

默认值gzip_static off;

gzip_static on;gzip_static off;都会检测是否存在.gz预压缩文件。

gzip_static always;会始终使用.gz预压缩文件。

1)对文件进行压缩,使用gzip命令

cd /usr/local/nginx/html
gzip jquery.js

2)修改配置文件

# gzip on;
gzip_static on;

我们再次访问http://192.168.110.98/jquery.js,文件大小为87.5KB,访问的是压缩过的.gz文件。

以上就是Nginx对静态资源传输的优化,Nginx是多模块化的,还有很多高级功能,我们后面继续探索。

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

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

相关文章

训练计划安排(练一休一训练分化+倒金字塔训练法)【了解即可,一般人容量不用练一休一,看抖音@孙悟饭桶】

目录 练一休一训练分化每次训练的组数12-15组 (4-5个动作)QA 倒金字塔训练法倒金字塔热身正式组常见误区: 训练补剂bcaa咖啡因肌酸蛋白粉 如何降低皮质醇水平如何提升睾酮水平文献出处睡眠8h摄入适量脂肪(0.8g每公斤体重&#xff…

java APT原理及APT实战 - 一步步教你写ButterKnife

一、定义 Java APT 是 Java 技术设计的一个 APT 架构, APT(Annotation Processing Tool)即注解处理器,它是一种处理注解的工具,也是javac中的一个工具,用于在编译阶段未生成class之前对源码中的注解进行扫…

Windows巧用git实现笔记自动备份

Windows巧用git实现笔记自动备份 准备git仓库配置自动上传脚本设置 Windows 自动定时任务参考文献 准备git仓库 安装git:https://git-scm.com/downloads: 注册并登录gitee,本地生成ssh key(详情百度),然后…

数据处理Pandas学习笔记(一)

import pandas as pdpandas值series创建 t pd.Series([1, 2, 31, 12, 3, 4]) t0 1 1 2 2 31 3 12 4 3 5 4 dtype: int64type(t)pandas.core.series.Seriesseries指定索引 t2 pd.Series([1,23,3,2,3],indexlist(abcde)) t2a 1 b 23 c 3 d …

【Java-05】常用API、正则表达式、Collection集合

主要内容 BigInteger类BigDecimal类Arrays类包装类String类的常用方法正则表达式Collection集合 1 BigInteger类 1.1 概述 概述 : java.math.BigInteger类是一个引用数据类型 , 可以用于计算一些大的整数 , 当超出基本数据类型数据范围的整数运算时就可以使用BigInteger了。…

类别无关的姿态估计ECCV2022

现有的2D姿态估计工作主要集中在某一类别,例如人类、动物和车辆。然而,有很多应用场景需要检测unseen对象类的姿态(或关键点)。因此作者提出CAPE任务(Category-Agnostic Pose Estimation),该任务…

Sketch哪个版本好用?

使用最新版本的 Sketch 是很有意义的。一方面,最新版本通常会有新的功能和改进,使设计师更方便地完成工作。另一方面,使用最新版本还可以避免出现因版本不兼容而无法打开源文件的问题。此外,最新版本通常会更稳定,因此…

Linux command(sar)

说明 sar命令是一个系统性能监测工具,用于收集、报告和分析系统的各种资源使用情况。以下是sar命令的基本用法: sar [选项] [时间间隔] [次数] 选项:可用的选项包括-a(显示所有资源使用情况)、-b(显示I/…

图片修复增强调研

Real-ESRGAN 工程地址:https://github.com/xinntao/Real-ESRGAN 效果: 人脸增强部分,调用的GFPGAN. GFPGAN 工程地址:https://github.com/TencentARC/GFPGAN 论文效果: BasicSR-ESRGAN: 项目地址&a…

[Qt编程之Widgets模块] -001: QButtonGroup抽象容器

1.QButtonGroup简介 QButtonGroup提供了一个抽象容器,可以将按钮小部件放入其中。它不提供此容器的可视化表示,而是管理组中每个按钮的状态。 互斥按钮组,将关闭除已单击的按钮外的所有可选中(可切换)按钮。默认情况下…

免费使用GPT-4.0?【AI聊天 | GPT4教学】 —— 微软 New Bing GPT4 申请与使用保姆级教程

目录 认识 New Bing 2. 注册并登录 Microsoft 账号 3. 如何免科学上网使用 New Bing? 4. 加入 WaitList 候补名单 5. 使用 New Bing! 6. 使用 Skype 免科学上网访问 New Bing! 7. 在 Chrome 浏览器中使用 New Bing! 8. 总…

如何利用splice()和slice()方法操作数组

如何利用splice()和slice()方法操作数组 前言splice()是什么,有什么用?怎么用?slice()是什么,有什么用?怎么用?splice和slice方法的区别小结 前言 splice&am…

如今的Android就业率惨不忍睹~

3月底公司大裁员,投了一个月简历,一天投个几十份简历,而收到面试通知的就那么三四家,要么就是薪水给得很低不想去,要么就是高薪水的Offer拿不下,而自己中意公司的却没有给出回应,唉……真难啊!&…

4.2 线性表顺序表

目录 目录结构 线性表 线性表的特征: 顺序表存储结构的表示 顺序表存储结构的特点 顺序存储结构的表示 线性表的基本运算 基本运算的相关算法 线性表的基本运算 线性表 目录结构 线性表 线性表是包含若干数据元素的一个线性序列 记为: L(a0, …

Istio virtual service 故障注入之延时(fixedDelay)、中断(abort)

Istio 故障注入 Istio 故障注入与其他在网络层引入错误(例如延迟数据包或者直接杀死 Pod)的机制不同,Istio 允许在应用程序层注入故障。这使得可以注入更多相关的故障,比如 HTTP 错误代码等。 Istio 可以注入两种类型的故障&…

iLO初识

文章目录 什么是iLO?为什么需要iLO?iLO界面介绍风扇状态温度状态存储控制器的电池组件cpu状态内存状态网络设备列表存储状态固件状态 什么是iLO? iLO(Integrated Lights-Out)是一种远程管理技术,用于管理和…

第7章链接:7.1 编译器驱动程序

示例程序由两个源文件组成,main.c 和 swap.c。 main函数初始化一个两元素的整数数组,然后调用swap函数来交换这一对数。 main.c void swap();int buf[2] {1, 2};int main() {swap();return 0; }swap.c extern int buf[];int *bufp0 &buf[0]; i…

Android系统日志3-trace

1、使用 主要追踪耗时,如上图所示,记录的是traceBegin和traceEnd之间的耗时,这些日志信息可以通过systrace查看 2、获取trace日志 https://developer.android.com/topic/performance/tracing/command-line?hlzh-cn https://developer.andr…

Linux之shell基础(六)

1、shell 简介 shell 介于内核与用户之间,负责命令的编辑,是人机交互的一个桥梁 shell 的种类 [rootyhm ~]# cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash /bin/ksh /bin/rksh /usr/bin/ksh /usr/bin/rksh种类说明/bin/shbash的一个…

学习HCIP的day.05

目录 十、ospf扩展配置&#xff1a; 1、认证 2、沉默接口 3、加快收敛 4、缺省路由 查看OSPF路由&#xff1b;显示本地发出和学习到的OSPF路由条目 <r10>display ospf routing 十、ospf扩展配置&#xff1a; 1、认证 直连的邻居或邻接之间&#xff0c;配置身…