文档章节

nginx学习--nginx下的gzip与vary、预压缩、缓存、反向代理的结合

spinachgit
 spinachgit
发布于 2018/12/23 10:17
字数 1776
阅读 143
收藏 2

来自:nginx系列(十七)nginx下的gzip与vary、预压缩、缓存、反向代理的结合

介绍

在http的协议里,为了减少网络传输,允许将报文进行gzip压缩以后再传输。虽然网络传输体积减小了,但是服务器压缩和浏览器的解压缩消耗了CPU的计算。

后来出现了预压缩技术,就是提前把静态文件进行gzip压缩,当请求来的时候,直接读走。这样服务器就没了压缩消耗,而浏览器的解压缩性能相比网络IO,影响不大。

一 动态nginx的gzip

每次请求来的时候,要实时进行压缩。但是有个问题,就是压缩过的文件,要重复压缩,这样后面的静态压缩就派上用场了。

  • 1.静态文件压缩

    每次请求静态文件的时候,都会动态压缩静态文件。

  • 2.反向代理压缩

    反向代理返回的报文,也是可以压缩的。但也是每次动态压缩。可以根据头信息处理

  • 3.代理缓存压缩,浏览器缓存

    在做反向代理的时候,可以缓存应用服务器返回的报文,支持缓存首部Cache-Control等。缓存的文件为明文。但是反向代理和压缩缓存,可以分层来解决。反向代理服务器动态压缩,而CDN直接缓存结果(压缩与非压缩)。相当于加了2层代理来处理。 对于浏览器,开启Expire首部,则浏览器可以缓存压缩后的结果,减少服务器请求。

  • 4.代理的vary首部压缩

    其实cdn,代理服务器,原理上都是代理服务器。他们一般以url为key值进行缓存。而vary属性的设置,告诉了代理根据url缓存的同时,vary的信息也作为key。比如客户端(浏览器)请求的信息里带上了Accept-Encoding:gzip 则返回压缩副本。如果没有带这个头信息,默认返回非压缩副本。

二 静态nginx的gzip:预压缩

对于静态文件先压缩再输出是再正常不过的事了,但是这种压缩都是动态的,在每次请求都会先压缩再输出,大大浪费了很多cpu。如果前端加了反向代理缓存,那能减少这种浪费。但不是每个生产环境前端都有缓存的。而nginx有个模块Gzip Precompression,这个模块的作用是对于需要压缩的文件,直接读取已经压缩好的文件(文件名为加.gz),而不是动态压缩,对于不支持gzip的请求则读取原文件。 ./configure --prefix=/opt/nginx/nginx-1.9.6 --with-http_gzip_static_module

  • 1.gzip_static配置优先级高于gzip
  • 2.开启nginx_static后,对于任何文件都会先查找是否有对应的gz文件
  • 3.gzip_types设置对gzip_static无效

压缩测试

验证方法也很简单。可以自行压缩不同大小的×.gz文件,通过浏览器调试工具查看返回的文件大小即可。 压缩命令 gzip -c -9 jquery-1.11.2.min.js > jquery-1.11.2.min.js.gz img 原始文件:284k 代码混淆,代码压缩:95k gzip压缩:33k 可以看到,284k的jquery文件,经过处理以后,变成了33k。

nginx配置文件

  • http节点下配置: gzip on;
  • location节点下配置 gzip_vary on; gzip_static on;

压缩有浏览器查看 img

完整配置文件请参考附件

三 常用命令和技巧

以下三条命令,都可以附加上Accept-Encoding首部,来获取压缩与非压缩的服务器报文

apache-bench 
./ab -n 100000 -c 16 -H 'Accept-Encoding: gzip' 'http://192.168.56.2:8080/cache_ehcache-2.10.0_web/ex^Cre' 

wget 
其中wget是以http/1.0请求的,这个要注意gizp里开启1.0的压缩,默认是不开启的 
wget --header=Accept-Encoding:gzip --save-headers  -d http://192.168.56.2:8080/cache_ehcache-2.10.0_web/expire 

curl 
curl -v -H "Accept-Encoding:gzip" http://192.168.56.2:8080/cache_ehcache-2.10.0_web/expire 


四 参数含义

  1. # 开启压缩
  2. gzip on;
  3. # 设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。默认值是0,不管页面多大都压缩。建议设置成大于2k的字节数,小于2k可能会越压越大。
  4. gzip_min_length 2k;
  5. # 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。 例如 4 4k 代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存。 4 8k 代表以8k为单位,按照原始数据大小以8k为单位的4倍申请内存。
  6. # 如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果。
  7. gzip_buffers 4 16k;
  8. #压缩级别,1-10,数字越大压缩的越好,也越占用CPU时间
  9. gzip_comp_level 5;
  10. # 默认值: gzip_types text/html (默认不对js/css文件进行压缩)
  11. # 压缩类型,匹配MIME类型进行压缩
  12. # 不能用通配符 text/*
  13. # (无论是否指定)text/html默认已经压缩
  14. # 设置哪压缩种文本文件可参考 conf/mime.types
  15. gzip_types text/plain application/x-javascript text/css application/xml;
  16. # 值为1.0和1.1 代表是否压缩http协议1.0,选择1.0则1.0和1.1都可以压缩
  17. gzip_http_version 1.0
  18. # IE6及以下禁止压缩
  19. gzip_disable "MSIE [1-6].";
  20. # 默认值:off
  21. # Nginx作为反向代理的时候启用,开启或者关闭后端服务器返回的结果,匹配的前提是后端服务器必须要返回包含"Via"的 header头。
  22. # off - 关闭所有的代理结果数据的压缩
  23. # expired - 启用压缩,如果header头中包含 "Expires" 头信息
  24. # no-cache - 启用压缩,如果header头中包含 "Cache-Control:no-cache" 头信息
  25. # no-store - 启用压缩,如果header头中包含 "Cache-Control:no-store" 头信息
  26. # private - 启用压缩,如果header头中包含 "Cache-Control:private" 头信息
  27. # no_last_modified - 启用压缩,如果header头中不包含 "Last-Modified" 头信息
  28. # no_etag - 启用压缩 ,如果header头中不包含 "ETag" 头信息
  29. # auth - 启用压缩 , 如果header头中包含 "Authorization" 头信息
  30. # any - 无条件启用压缩
  31. gzip_proxied expired no-cache no-store private auth;
  32. # 给CDN和代理服务器使用,针对相同url,可以根据头信息返回压缩和非压缩副本
  33. gzip_vary on;

五 参考资料

nginx 预压缩(gzip)静态文件 http://willko.iteye.com/blog/667091

Nginx中gzip_static模块的使用 http://inosin.iteye.com/blog/1299705

Nginx 开启Gzip压缩的方法(非常的详解) http://www.111cn.net/sys/nginx/69492.htm

Nginx Gzip模块启用和配置指令详解 http://www.jb51.net/article/48995.htm

linux下gzip的压缩详解 http://booby325.iteye.com/blog/1685855

加速nginx: 开启gzip和缓存 http://www.darrenfang.com/2015/01/setting-up-http-cache-and-gzip-with-nginx/

配置vary http://www.webkaka.com/blog/archives/how-to-set-Vary-Accept-Encoding-header.html

本文转载自:https://phl.iteye.com/blog/2253442

spinachgit
粉丝 10
博文 267
码字总数 269029
作品 0
亳州
架构师
私信 提问
Nginx的Gzip压缩简单配置

ngxhttpgzip_module模块 主要负责Gzip功能的开启和设置,对相应数据进行实时压缩. gzip指令 用于开启Gzip功能 ,默认为off gzip_buffers指令 用于设置Gzip压缩文件使用缓存空间的大小 number指...

期待l
2018/08/07
0
0
Nginx开启Gzip压缩大幅提高页面加载速度

有时候我们会碰到API接口响应很快,但是完成速度很慢的情况,其主要原因是数据传输过大。因此我们需要对数据进行压缩,现这里采用Nginx自带的压缩功能。 1、Vim打开Nginx配置文件 vim /usr/l...

算法之名
01/07
49
0
Nginx Gzip模块启用和配置指令详解

参考一 http://www.111cn.net/sys/nginx/69492.htm 参考二 查找nginx安装的路径以及相关安装操作命令 参考三 http://blog.csdn.net/u011078940/article/details/51276765 Nginx的gzip模块是内...

james_laughing
2016/12/23
31
0
实操 Web Cache

实操 Web Cache http://netkiller.github.io/journal/cache.html Mr. Neo Chen (netkiller), 陈景峰(BG7NYT) 中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 +86 755 298......

netkiller-
2014/05/17
897
3
实操 Web Cache (第二版)

实操 Web Cache http://netkiller.github.io/journal/cache.html Mr. Neo Chen (陈景峰), netkiller, BG7NYT 中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 +86 755 298......

netkiller-
2015/08/27
161
0

没有更多内容

加载失败,请刷新页面

加载更多

可能是国内第一篇全面解读 Java 现状及趋势的文章

作者 | 张晓楠 Dragonwell JDK 最新版本 8.1.1-GA 发布,包括全新特性和更新! 导读:InfoQ 发布《2019 中国 Java 发展趋势报告》,反映 Java 在中国发展的独特性,同时也希望大家对 Java 有...

阿里云官方博客
13分钟前
3
0
Spring Boot 2.x基础教程:Swagger静态文档的生成

前言 通过之前的两篇关于Swagger入门以及具体使用细节的介绍之后,我们已经能够轻松地为Spring MVC的Web项目自动构建出API文档了。如果您还不熟悉这块,可以先阅读: Spring Boot 2.x基础教程...

程序猿DD
17分钟前
3
0
《毅力》读书笔记

1.确信你全身心地投入 2.准备好为目标进行艰难的跋涉 3.通过减少需要使用毅力的情形,为将来的挑战做好准备 4.尽可能具体细致地确定你的目标和实现目标的过程 5.把挑战分解为小而易于管理的小...

lingch
18分钟前
3
0
zk中快速选举FastLeaderElection实现

选举涉及概念 服务器状态 投票 如何选择投票? 协议 选举 如何进行选举? epoch 发送者 接收者 发送队列 接收队列 服务器状态 public enum ServerState { LOOKING,寻找Leader状态,当服务处于...

writeademo
21分钟前
3
0
教你玩转Linux—磁盘管理

Linux磁盘管理好坏直接关系到整个系统的性能问题,Linux磁盘管理常用三个命令为df、du和fdisk。 df df命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少...

Linux就该这么学
24分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部