gzip压缩实践

JavaScript09

gzip压缩实践,第1张

为提高网页加载速度,启用 gzip 缩减资源的大小是非常常见的手段。现代浏览器均支持 gzip 压缩,并会为HTTP请求自动协商此类压缩。

本文将对 gzip 的实践和原理做一个简单的总结。

web服务器在接收到浏览器的请求之后,会检查浏览器可以接受哪些压缩方法,详情可见下图。

浏览器在请求头中会带上 Accept-Encoding 这个参数来说明自己支持哪些内容编码方式。

而服务端返回的 Response Headers 中则存在一个 Content-Encoding ,用来说明数据的压缩方法。

几乎所有的浏览器都已经支持了 gzip ,并且有请求头的验证,所以基本不需要担心兼容相关的问题。

压缩前后的体积前后差异,可以在控制台中看到。可以说,对于js、css文件的压缩率还是比较可观的。

经过这种方式的配置,在服务端响应请求的时候会对文件进行压缩,之后返回压缩过后的内容。不过压缩这一过程多多少少会占用一些服务端的性能,具体压缩的程度,也就是 gzip_comp_level 设置的值也会影响到占用性能的多少,接下来我们来看一些网上搜集到的数据,了解不同值的设置对文件大小和CPU占用的影响。

可以看到,压缩级别从0到1时,文件大小明显减小,CPU消耗略微上涨。而在之后文件减小的速率明显放缓,在达到了5之后继续增加压缩级别,文件的体积也几乎没有缩小,但CPU消耗却有较为明显的上涨。

根据结论可以看出,如果是在服务端使用 gzip 压缩的话,考虑到性能和压缩率的取舍,将压缩级别设置为一个较低的值,比如2之类的,是比较合理的。

我们也可以选择在打包构建项目的时候就对文件进行gzip压缩

这边以打包一个 webpack 的前端项目为例

运行构建命令后可以看到,在生成 .js 和 .css 的同时还生成了对应的 .gz 文件。

在这种方式的压缩中,我们完全可以把压缩等级设置为一个比较高的值(默认),毕竟只是略微影响打包的时间,却能获取一个更小的体积的包,还是比较值得的。

以 nginx 为例,静态压缩需要使用 http_gzip_static_module 这个模块,这个模块不是默认的,应使用 --with-http_gzip_static_module 的配置参数启用它

之后再配置中添加

这样便可开启静态压缩。

需要注意以下几点:

适合缓存的内容

1. 不变的图像,如logo,图标等

2. js、css静态文件

3. 可下载的内容,媒体文件

适合协商缓存

1. HTML文件

2. 经常替换的图片

3. 经常修改的js、css文件,js、css文件的加载可以加入文件的签名来拒绝缓存,如‘index.css?签名’,‘index.签名.js’

不建议缓存的内容

1. 用户隐私等敏感数据

2. 经常改变的API数据接口

NGINX配置缓存策略

本地缓存配置

1. add_header指令:添加状态码为2XX和3XX的响应头信息,设置代码add_header name value [always],可以设置Pragma、Expires、Cache-Control,可以继承

2. expires指令:通知浏览器过期时长,设置代码expires time

3. Etag指令:指定签名,设置代码etag on|off,默认on

前端代码和资源压缩

优势

1. 让资源文件更小,加快文件在网络中的传输,让网页更快的展现,降低带宽和流量的开销

压缩方式

1. js、css、图片、html代码的压缩

2. gzip压缩

gzip配置

gzip on|off#是否开启gzipgzip_buffers 32 4K|16 8K#缓冲(在内存中缓存几块?每块多大)gzip_comp_level [1-9] #推荐6,压缩级别(级别越高,压得越小,越浪费CPU计算资源)

gzip_disable #正则匹配UA,什么样的Uri不进行gzip

gzip_min_length 200 #开始压缩的最小长度

gzip_http_version 1.0|1.1 #开始压缩的http协议版本

gzip_proxied #设置请求者代理服务器,该如何缓存内容

gzip_types text/plain application/xml image/png #对哪些类型的文件压缩,如txt、xml、css

gzip_vary on|off #是否传输gzip压缩标志

CDN加速

定义

1. CDN的全称content delivery network,内容分发网络

2. 尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定

3. 在网络各处放置节点服务器所构成的有的互联网基础之上的一层智能虚拟网络

4. CDN系统能够实现地根据网络流量和各节点的连接、负载状况以及到用户距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上

优势

1. 本地cache加速,提高了企业站点(尤其含有大量图片和静态页面站点)的访问速度

2. 跨运营商的网络加速,保证不同网络的用户都能得到良好的访问质量

3. 远程访问用户根据DNS负载均衡技术只能选择cache服务器

4. 自动生成服务器的远程Mirror(镜像)cache服务器,远程用户访问时从cache服务器上读取数据,减少远程访问的带宽、分担网络流量、减轻原站点web服务器负载等功能

5. 广泛分布的cdn节点加上节点之间的智能冗余机制,可以有效地预防黑客入侵

工作原理

1. 用户发起请求

2. 智能DNS的解析(根据IP判断地理位置、接入网类型、选择路由最短和负载最轻的服务器)

3. 取得缓存服务器ip

4. 把内容返回给用户(如果缓存中有,没有就执行5、6、7)

5. 向源站发起请求

6. 将结果返回给用户

7. 将结果存入缓存服务器

适用场景

1. 站点或者应用中大量静态资源的加速分发,例如css、js、图片和HTML

2. 大文件下载

3. 直播网站

独立图片服务器

必要性

1. 分担web服务器的I/O负载,将耗费资源的图片服务器分离出来,提高服务器的性能和稳定性

2. 能够专门对图片服务器进行优化,为图片服务器设置针对性的缓存方案,减少带宽成本,提高访问速度

3. 提高网站的可扩展性,通过增加图片服务器,提高图片吞吐能力

采用独立域名

原因:

1. 同一域名下浏览器的并发连接数有限制,突破浏览器连接数的限制

2. 由于cookie的原因,对缓存不利,大部分web cache都只缓存不带cookie的请求,导致每次的图片请求都不能命中cache

如何图片上传和同步

1. NFS共享方式

2. 利用FTP同步

动态语言静态化

将现有的PHP等动态语言的逻辑代码生成为静态的HTML文件,用户访问动态脚本重定向到静态HTML文件的过程。对实时性要求不高

原因:

1. 动态脚本通过会做逻辑计算和数据查询,访问量越大,服务器压力越大

2. 访问量大时可能会造成CPU负载过高,数据库服务器压力过大

3. 静态化可以减低逻辑处理压力,降低数据库服务器查询压力

实现方法

1. 使用模板引擎

2. 利用ob系列函数

需要获取swoole、workerman、TP、laravel、vue、Linux、redis以及性能优化,并发项目实战,微服务 架构方面的资料,可以私信我哦

下面”舒宇卓创站长“将和大家一起分享一下,希望对咱们站长有所帮助! 1.开启网页GZIP压缩有什么好处? Gzip开启以后会将输出到用户浏览器的数据进行压缩的处理,这样就会减小通过网络传输的数据量,提高浏览的速度。 进而对于搜索引擎的收录也有一定的好处,也大大提高了我们的用户体验度。 2.如何启用IIS的Gzip压缩功能: 首先要有网站管理权限和服务器远程管理权限步骤如下: 第一、如果你需要压缩静态文件(HTML),需要在硬盘上建一个目录,并给它“IUSR_机器名”这个用户的写权限。如果压缩动态文件(PHP,asp,aspx)就不需要了,因为它的页面是每次都动态生成的,压缩完就放弃。打开Internet信息服务(IIS)管理器,右击“网站”—>“属性”(注意:这里的网站是整个网站文件不是某个网站目录),之后选择“服务”。在“HTTP压缩”框中选中“压缩应用程序文件”和“压缩静态文件”,按需要设置“临时目录”和“临时目录的最大限制”。 第二、在Internet信息服务(IIS)管理器,右击“Web服务扩展”—>“增加一个新的Web服务扩展”,在“新建Web服务扩展”框中输入扩展名“HTTP Compression”,添加“要求的文件”为C:\WINDOWS\system32\inetsrv\gzip.dll,其中Windows系统目录根据您的安装可能有所不同,选中“设置扩展状态为允许”;这时候静态内容是可以压缩的,但是对于动态内容,aspx文件却不在压缩范围内。因为默认的可压缩文件并没有这个扩展名。而管理界面中你又找不到可以增加扩展名的地方,这时候只能去修改它的配置文件了。 第三、使用文本编辑器打开C:\Windows\System32\inetsrv\MetaBase.xml(建议先备份),查找 IIsCompressionScheme标签,有三个相同名字的段,分别是deflate,gzip,Parameters,第三段不用管它,前两段有基本相同的参数,HcDynamicCompressionLevel,设置压缩率,取值0~10,0不压缩,10最高压缩率,这里设置成9,9是性价比最高的一个。HcFileExtensions,需要压缩的静态文件扩展名,默认只有htm,html,txt,可以把js,css,xml添加进去。建议按原来的格式,用换行作为分隔。