--
邮件自: 列表“openresty”,专用于技术讨论!
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+...@googlegroups.com
详情: http://groups.google.com/group/openresty
官网: http://openresty.org/
仓库: https://github.com/agentzh/ngx_openresty
建议: 提问的智慧 http://wiki.woodpecker.org.cn/moin/AskForHelp
教程: http://agentzh.org/misc/nginx/agentzh-nginx-tutorials-zhcn.html
你好,agentzh
目前我们有一个需求,不知道你有什么好的建议,向你请教一下。
我们的业务场景如下:
使用nginx做反向代理,开启nginx代理缓存
1. nginx在向源站发起请求时,我们希望通过强制增加
Accept-Encoding:gzip 来告知源希望得到返回gzip压缩的数据
2. 如果源开启了gzip,会对我们请求的资源进行压缩,同时在响应头中增加 Content-Encoding:gzip。这样nginx在接收到数据后,在开启缓存的情况下,会在磁盘存储内容是经过gzip压缩后的数据。
如果源站未开启gzip压缩,返回的响应内容应该是未经过gzip压缩的
我们的需求是:
1. 希望nginx永远缓存经过gzip压缩的内容。即便源站不支持gzip压缩,在得到源站的响应数据后,我们实时进行gzip(对于同一个数据,只会压缩一次,比只存储原始内容,应对相同url请求时,每次进行gzip压缩要节省cpu重复执行次数)
2. 由于存储了压缩后的数据,为了应对部分浏览器不支持gzip解压缩,我们使用了gunzip模块,针对这种情况对磁盘存储的压缩过的内容进行实时解压缩(经过我们分析,这样的请求应该占少数)
我们这样设计的目的有两点:
1. 希望充分利用磁盘空间,尽量多的存储文件数
2. 由于大多数客户端请求都是支持gzip解压缩的,我们在处理这些请求时不需要实时gzip压缩数据,希望节省cpu
但是遇到的问题是:
需要在upstream响应上游的body时,检测上游的响应头,是否包含Content-Encoding:gzip,如果不包含,需要实时进行gzip压缩,将内容存储到磁盘文件,同时维护一个变量,需要代表该份内容已经执行过压缩,在请求执行 gzip_filter模块时,除了原有nginx的检查外,还需要检查该变量,以保证不会重复执行格gzip压缩,导致返回给客户的数据时经过两次压缩的数据。
基本的实现思路虽然了解,但是以我们目前的开发水平,还不足以十分有把握的能保证改对每一个地方,关于这块,你有什么好的建议
比如:
1. 我们是必须修改upstream模块来加入上述功能,同时在request结构体中增加一个变量,并在upstream中实际执行过gzip压缩后进行设置
2. 还是,我们可以独立开发出一个模块,提供一些类似于gzip的指令,在配置文件中类似于配置gzip on;的处理一样。但是这样的自定义模块,该如何嵌入到upstream处理上游响应的代码中,是在有点困惑,真心的希望得到你的帮助
谢谢
by lingyun