Brotli 是google新出的一个压缩算法,据说比Zopfli的压缩率要高20–26%(Zopfli是google之前发布的一个和Deflate兼容的压缩算法)。 Chrome 49+、Firefox 44+以及Opera 36+都支持Brotli了,所以,是时候尝试一把了。 但是为了支持这个特性,自己编译部署nginx太麻烦了, nginx 1.9.11开始支持动态模块 ,所以也来尝试一把。 系统需求sudoapt-get installautoconflibtoolnginx-extras 本人测试环境 ubuntu 14.04, ppa:nginx/stable, nginx/1.10.1 安装libbrotli按照 libbrotli 的说明,依次执行如下命令安装 gitclone https://github.com/bagder/libbrotli ./autogen.sh ./configure make sudomake install 为了让系统中使用到libbrotli的程序能够加载so文件,故创建软链: sudoln -s /usr/local/lib/libbrotlienc.so.1 /lib/libbrotlienc.so.1 准备源代码下载nginx和ngx_brotli的源代码: wgethttp://nginx.org/download/nginx-1.10.1.tar.gz gitclone https://github.com/google/ngx_brotli 编辑 ngx_brotli/config 文件,在顶部添加一行 have=NGX_HTTP_HEADERS . auto/have configure在nginx源码目录执行 ./configure \ --add-dynamic-module=../ngx_brotli/ \ --with-http_dav_module \ --with-http_realip_module \ --with-http_v2_module \ --with-threads \ --with-http_ssl_module \ --with-ipv6 并make,得到两个so文件: $ find -namengx_http_brotli*.so ./objs/ngx_http_brotli_static_module.so ./objs/ngx_http_brotli_filter_module.so 加载模块在 /etc/nginx/nginx.conf 文件中添加如下两行,使nginx加载模块: load_module '/path/to/ngx_http_brotli_static_module.so'; load_module '/path/to/ngx_http_brotli_filter_module.so'; 接下来在http段中添加如下两个配置: brotlion; brotli_staticon; 再执行 sudo nginx - t 看看有没有错误,如果没有错误的话那就成功了。 不过,brotli压缩算法只有在https连接中才能生效。 module “/path/to/ngx_http_brotli_static_module.so” is not binary compatible in nginx.conf这个错误是由于 module的signature和nginx的signature不匹配 导致的,我的解决办法是,打印出这两个signature,逐位比对,并据此调整configure的参数。 参考 ngx_module.h 比如, 第25位 表示 NGX_HTTP_V2 定义与否,此时可以添加--with-http_v2_module 来修正signature。 第22位 表示NGX_THREADS定义与否,可以添加–with-threads来修正。 第8位和第9位 与IPv6有关,只需添加–with-ipv6即可。 至于 第30位 ,只能通过编辑 ngx_brotli/config 文件,添加have=NGX_HTTP_HEADERS . auto/have 来搞定了。 nginx使用 NGX_MODULE_SIGNATURE 字符串作为版本兼容标识,再用strcmp判别,兼顾了判别的准确性和可扩展性,但是对于动态扩展,这个显然太严格了。 (责任编辑:好模板) |