gzip导致chunked部分优点遭屏蔽?

267 views
Skip to first unread message

yurn...@gmail.com

unread,
Oct 15, 2013, 11:20:50 PM10/15/13
to openresty
Hi,all:
 
1. chunked 分块传输到浏览器,可以先把 css 传输给浏览器然后让浏览器进行 css 的下载,跟内容的加载并行,提高显示速度
2. 目前搜索到的资料显示,如果chunked和 gzip一起用,那么浏览器也是得到所有的 chunk 之后,再进行解压,才能进行解析

问题:
如果 chunked 和 gzip 一起使用的时候,还能够实现 1 那样的功能么?
原理是? 目前资料比较少 还没得到较好的解释。

Best regards,
-yurnerola

Yichun Zhang (agentzh)

unread,
Oct 16, 2013, 1:08:10 AM10/16/13
to openresty
Hello!

2013/10/15 yurnerola:
> 1. chunked 分块传输到浏览器,可以先把 css 传输给浏览器然后让浏览器进行 css 的下载,跟内容的加载并行,提高显示速度

是的,这是常用的网页优化方法。

> 2. 目前搜索到的资料显示,如果chunked和 gzip一起用,那么浏览器也是得到所有的 chunk 之后,再进行解压,才能进行解析
>

与其相信网上随便搜索到的资料,还不如自己进行测试 :)

考虑下面这个很简单的例子:

http {
gzip on;
gzip_min_length 1;

server {
listen 8080;

location = /t {
default_type text/html;
content_by_lua '
local rep = string.rep
local say = ngx.say
local sleep = ngx.sleep
local flush = ngx.flush
for i = 1, 10 do
say(rep("hello world", 20))
say(rep("=", 80))
flush(true)
sleep(1)
end
';
}
}
}

在这个例子里,我们每隔 1 秒钟就刷出去一段文本。我们同时启用了 nginx 的 gzip 压缩。

使用 curl 7.24.0, Firefox 22.0, 和 Chrome 30.0 都可以实时地解压并显示每一段输出。

我在测试时,curl 传入了 --compressed 选项,从而启用 gzip 压缩。而在 Firefox 和 Chrome
中都通过工具确认了响应体确实是经过压缩的 :)

值得一提的是,我的这个例子至少需要 1.5.3 以上版本的 nginx 才能正确工作。因为之前的版本里的标准的 ngx_gzip 模块有一个
bug,最早是在 1.5.3 里修复的。对应的官方补丁在这里:

http://hg.nginx.org/nginx/rev/84155a389bcc

> 问题:
> 如果 chunked 和 gzip 一起使用的时候,还能够实现 1 那样的功能么?

当然可以。上面我已经给出了一个测试过的实例 :)

> 原理是? 目前资料比较少 还没得到较好的解释。

原理很简单:gzip 压缩和解压本来就是支持按数据块进行流式处理的 :)

Best regards,
-agentzh

yurn...@gmail.com

unread,
Oct 16, 2013, 2:55:23 AM10/16/13
to openresty
了然了。但是我大IE不是的。IE为整体输出的。
 
另外,不应该是先gzip filter,然后chunked filter。浏览器理应得到所有的chunked再解压的呀。。==就像zip文件的一部分不可以单独解压一样。
 

Best regards,
-yurnerola
 
发送时间: 2013-10-16 13:08
收件人: openresty
主题: Re: [openresty] gzip导致chunked部分优点遭屏蔽?
--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 openresty...@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+...@googlegroups.com

Yichun Zhang (agentzh)

unread,
Oct 16, 2013, 4:56:31 PM10/16/13
to openresty
Hello!

2013/10/15 yurnerola:
> 了然了。但是我大IE不是的。IE为整体输出的。
>

我没试过 IE,因为我现在能接触到的机器上都没有安装 Windows.

你可以拿我的例子用 IE 8 之类的版本实际测试一下。

> 另外,不应该是先gzip filter,然后chunked
> filter。浏览器理应得到所有的chunked再解压的呀。。==就像zip文件的一部分不可以单独解压一样。
>

这里有两层编码,一层是 Content-Encoding(gzip),一层是
Transfer-Encoding(chunked)。这里这两种编码都支持流式处理。

HTTP 客户端不需要接收到所有的 chunked 才开始显式。

gzip 压缩后的文件也可以分块一块一块地解压,只要是从第一块开始,按照顺序来就行了。流式处理都是有状态的。关于这一点,你可以直接看一下
zlib 库的 C API 的文档。这是常识。

最后,建议仔细阅读一下 chunked 编码相关的细节,以避免不必要的麻烦和困惑。这其实也算常识了 :)

Regards,
-agentzh
Reply all
Reply to author
Forward
0 new messages