前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「简明性能优化」双端开启Gzip指南

「简明性能优化」双端开启Gzip指南

作者头像
前端劝退师
发布2019-09-17 15:32:40
1.4K0
发布2019-09-17 15:32:40
举报
文章被收录于专栏:前端劝退师前端劝退师

本文目录:

  1. 开启gzip压缩的好处
  2. Webpackgzip设置
  3. Nginxgzip设置
  4. 如何验证 gzip
  5. 双端Gzip的区别和意义

1. 开启gzip压缩的好处

可以减小文件体积,传输速度更快。gzip是节省带宽和加快站点速度的有效方法。

  • 服务端发送数据时可以配置 Content-Encoding:gzip,用户说明数据的压缩方式
  • 客户端接受到数据后去检查对应字段的信息,就可以根据相应的格式去解码。
  • 客户端请求时,可以用 Accept-Encoding:gzip,用户说明接受哪些压缩方法。

在 http/1.0 协议中关于服务端发送的数据可以配置一个 Content-Encoding 字段,这个字段用于说明数据的压缩方法

代码语言:javascript
复制
Content-Encoding: gzip
Content-Encoding: compress
Content-Encoding: deflate

客户端在接受到返回的数据后去检查对应字段的信息,然后根据对应的格式去做相应的解码。客户端在请求时,可以用 Accept-Encoding 字段说明自己接受哪些压缩方法。

代码语言:javascript
复制
Accept-Encoding: gzip, deflate

2. Webpackgzip设置

这里使用的插件为: CompressionWebpackPlugin

代码语言:javascript
复制
const CompressionWebpackPlugin = require('compression-webpack-plugin')
module.exports = { 
    “plugins”:[new CompressionWebpackPlugin] 
}

官方文档

具体配置:

代码语言:javascript
复制
const CompressionWebpackPlugin = require('compression-webpack-plugin');

webpackConfig.plugins.push(
    new CompressionWebpackPlugin({
      asset: '[path].gz[query]',
      algorithm: 'gzip',
      test: new RegExp('\\.(js|css)$'),
      // 只处理大于xx字节 的文件,默认:0
      threshold: 10240,
      // 示例:一个1024b大小的文件,压缩后大小为768b,minRatio : 0.75
      minRatio: 0.8 // 默认: 0.8
      // 是否删除源文件,默认: false
      deleteOriginalAssets: false
    })
)

开启gzip前

开启gzip后

gzip后的大小从277KB到只有~91.2KB!

3. Nginxgzip设置

打开 /etc/nginx/conf.d编写以下配置。

代码语言:javascript
复制
server {
    gzip on;
    gzip_static on;    
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_proxied  any;
    gzip_vary on;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    # 注:99.99%的浏览器基本上都支持gzip解压了,所以可以不用设这个值,保持系统默认即可。
    gzip_http_version 1.1;    
    ...
}

gzip on|off

  • 默认值: gzip off
  • 开启或者关闭gzip模块

gzip_static on|off

  • nginx对于静态文件的处理模块
  • 该模块可以读取预先压缩的gz文件,这样可以减少每次请求进行gzip压缩的CPU资源消耗。
  • 该模块启用后, nginx首先检查是否存在请求静态文件的gz结尾的文件,如果有则直接返回该gz文件内容。为了要兼容不支持gzip的浏览器,启用 gzip_static模块就必须同时保留原始静态文件和gz文件。这样的话,在有大量静态文件的情况下,将会大大增加磁盘空间。我们可以利用nginx的反向代理功能实现只保留gz文件。

gzip_types mime-type[mime-type...]:

  • nginx作为反向代理的时候启用,开启或者关闭后端服务器返回的结果,匹配的前提是后端服务器必须要返回包含"Via"的 header头
  • 默认值: gzip_types text/html (默认不对js/css文件进行压缩)
  • 压缩类型,匹配MIME类型进行压缩

gzip_proxied[off|expired|no-cache|no-store]...:

  • off - 关闭所有的代理结果数据的压缩
  • no-cache - 启用压缩,如果header头中包含 " Cache-Control:no-cache" 头信息

gzip_vary on|off:

  • http头有关系,加个 vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的 HTTP头来判断,是否需要压缩

gzip_comp_level:

  • 默认值:1(建议选择为4~6)
  • gzip压缩比/压缩级别,压缩级别1-9,级别越高压缩率越大,当然压缩时间也就越长(传输快但比较消耗cpu)。

gzip_buffers:

  • 默认值: gzip_buffers44k/8k
  • 设置系统获取几个单位的缓存用于存储 gzip的压缩结果数据流。 例如 4 4k 代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存。 4 8k 代表以8k为单位,按照原始数据大小以8k为单位的4倍申请内存。
  • 如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储 gzip压缩结果。

gziphttpversion:

  • 默认值: gzip_http_version1.1(就是说对 HTTP/1.1协议的请求才会进行 gzip压缩)
  • 注:99.99%的浏览器基本上都支持 gzip解压了,所以可以不用设这个值,保持系统默认即可。

保存配置后,重新启动 Nginx:

代码语言:javascript
复制
$ sudo service nginx restart

开启gzip前

开启gzip后

4. 如何验证 gzip

可以看 Network,但这里我更推荐用 curl:

通过使用 curl测试每个资源的请求响应,并检查 Content-Encoding

显示 Content-Encoding:gzip,即为配置成功

5. 双端Gzip区别详解

不同之处在于:

  • Webpack压缩会在构建运行期间一次压缩文件,然后将这些压缩版本保存到磁盘。
  • nginx在请求时压缩文件时,某些包可能内置了缓存,因此性能损失只发生一次(或不经常),但通常不同之处在于,这将在响应 HTTP请求时发生。
  • 对于实时压缩,让上游代理(例如 Nginx)处理 gzip和缓存通常更高效,因为它们是专门为此而构建的,并且不会遭受服务端程序运行时的开销(许多都是用C语言编写的) 。
  • 使用 Webpack的好处是, Nginx每次请求服务端都要压缩很久才回返回信息回来,不仅服务器开销会增大很多,请求方也会等的不耐烦。我们在 Webpack打包时就直接生成高压缩等级的文件,作为静态资源放在服务器上,这时将 Nginx作为二重保障就会高效很多。
  • 注:具体是在请求时实时压缩,或在构建时去生成压缩文件,就要看项目业务情况。

免责声明

不是打算教 WebpackNginx,只是觉得好玩就简单写了一下。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端劝退师 微信公众号,前往查看

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

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 开启gzip压缩的好处
  • 2. Webpack的 gzip设置
  • 3. Nginx的 gzip设置
  • 4. 如何验证 gzip?
  • 5. 双端Gzip区别详解
    • 免责声明
    相关产品与服务
    文件存储
    文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档