新公司上班,公司在双井地铁站附近的九龙花园居民区里,住则住在百子湾家园,一个只有一条路通向外面的封闭地方。每天上下班由小蔡接送,除了车子不密封,早晚稍微有点冷以外,一切都还好。
继续为 nginx 增加 deflate 压缩支持。公司居然用的是 nginx 0.7.33 的最新开发版本,虽然不时的有 502 bad gateway 出现,但老高不以为然。打开0.7.33 代码一看,比 0.6 版本的整洁了许多,gzip 添加头,尾的动作都被封装到了单独的函数中了,再也不是一个大函数从头写到尾了,有进步。
起初是想为 deflate 压缩单独写一个与 gzip 平行的模块,拿原先 gzip 模块的 c 文件(src/http/modules/ngx_http_gzip_filter_module.c)一通 “搜索”-“替换”,编译通过了,但新模块死活没有被调用。想想也是,http 请求头的处理不在这个 c 文件里面,只改这个文件,当然不会有效果了。
接下来就把原来的 gzip c 文件一通猛改,添加头的函数直接 return,添加尾的函数也去掉具体添加的动作,最后再把 Content-Encoding 改过来,一测试,呵呵,还真的省下来 18 个字节!
但这样以来 gzip 就不支持了。更严重的是,如果(虽然可能性比较小),一个客户端只支持 gzip,不支持 deflate,那么它就无法解析请求的结果。在查看 src/http/ngx_http_core_module.c 里的 ngx_http_gzip_ok 函数的时候,终于发现了对于客户端提交的 header 里面的 accept encoding 的判断处理:
ngx_strcasestrn(r->headers_in.accept_encoding->value.data,
“gzip”, 4 – 1) == NULL
而 ngx_http_request_t *r 几乎在每一个函数里都是可用的。为了尽量减少改动的文件数量和代码处,也是为了尽量保险起见,我选择了在 src/http/modules/ngx_http_gzip_filter_module.c 文件里每一个改动的地方都做一次这样的判断:客户端是否支持 deflate,如果支持,则按 deflate 的做法进行修改,如果不支持,则保持原来 gzip 的样子。
编译,测试,ubuntu 8.10 + firefox 3.0.4 ,httpfox 下测试通过。
patch: http://code.google.com/p/fulin/source/browse/C%2B%2B/nginx/nginx0.7.33.deflate.patch
效果:
浏览器 Accept-Encoding:
gzip:使用 gzip
deflate:使用 deflate
gzip,deflate:使用 deflate
无:不压缩
nginx 版本:nginx-0.7.33
patch 使用方法:将 patch 文件放置于与 nginx-0.7.33 目录同级的地方,使用命令:
patch -p0 < nginx.deflate.patch
然后按正常流程 configure,make,make install
PS. 元宵节,外面鞭炮此起彼伏,而屋里此时就我一个人,alone,lonely。春节结束了,新的,漫长的一年又开始了。祝所有我爱的和爱我的人节日快乐!
{ 3 } Comments
502 Bad gateway 的问题不是 Nginx 的事情。:)
前端优化不止能省出 18 个字节来! 数据是一个包一个包发送的, 18 个字节只能减小多发一个包的概率. 话说偶的某文就是专门骂这个事的
你好网主. 我看到 mod_deflate 其实就是 nginx 的作者所写的. 但为何 nginx 自己本身是用 gzip 的?
http://sysoev.ru/mod_deflate/
那你这个补丁能在最新版本的 nginx 使用吗? 谢谢!
Post a Comment