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

2024-01-28 02:38

本文主要是介绍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 
 
原始文件:284k 
代码混淆,代码压缩:95k 
gzip压缩:33k 
可以看到,284k的jquery文件,经过处理以后,变成了33k。 

nginx配置文件 
http节点下配置: 
gzip  on; 
location节点下配置 
gzip_vary on; 
gzip_static on; 

压缩有浏览器查看 
 

完整配置文件请参考附件 


三 常用命令和技巧 
以下三条命令,都可以附加上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 


四 参数含义 

Python代码 

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

这篇关于nginx系列(十七)nginx下的gzip与vary、预压缩、缓存、反向代理的结合的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/652218

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Redis解决缓存击穿问题的两种方法

《Redis解决缓存击穿问题的两种方法》缓存击穿问题也叫热点Key问题,就是⼀个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击,本文给大家介绍了Re... 目录引言解决办法互斥锁(强一致,性能差)逻辑过期(高可用,性能优)设计逻辑过期时间引言缓存击穿:给

Nginx配置location+rewrite实现隐性域名配置

《Nginx配置location+rewrite实现隐性域名配置》本文主要介绍了Nginx配置location+rewrite实现隐性域名配置,包括基于根目录、条件和反向代理+rewrite配置的隐性... 目录1、配置基于根目录的隐性域名(就是nginx反向代理)2、配置基于条件的隐性域名2.1、基于条件

Ubuntu中Nginx虚拟主机设置的项目实践

《Ubuntu中Nginx虚拟主机设置的项目实践》通过配置虚拟主机,可以在同一台服务器上运行多个独立的网站,本文主要介绍了Ubuntu中Nginx虚拟主机设置的项目实践,具有一定的参考价值,感兴趣的可... 目录简介安装 Nginx创建虚拟主机1. 创建网站目录2. 创建默认索引文件3. 配置 Nginx4

Nginx如何进行流量按比例转发

《Nginx如何进行流量按比例转发》Nginx可以借助split_clients指令或通过weight参数以及Lua脚本实现流量按比例转发,下面小编就为大家介绍一下两种方式具体的操作步骤吧... 目录方式一:借助split_clients指令1. 配置split_clients2. 配置后端服务器组3. 配