将ngx_brotli编译成动态nginx模块
Brotli是google新出的一个压缩算法,据说比Zopfli的压缩率要高20–26%(Zopfli是google之前发布的一个和Deflate兼容的压缩算法)。 Chrome 49+、Firefox 44+以及Opera 36+都支持Brotli了,所以,是时候尝试一把了。 但是为了支持这个特性,自己编译部署nginx太麻烦了,nginx 1.9.11开始支持动态模块,所以也来尝试一把。
系统需求
sudo apt-get install autoconf libtool nginx-extras
本人测试环境ubuntu 14.04, ppa:nginx/stable, nginx/1.10.1
安装libbrotli
按照 libbrotli 的说明,依次执行如下命令安装
git clone https://github.com/bagder/libbrotli
./autogen.sh
./configure
make
sudo make install
为了让系统中使用到libbrotli的程序能够加载so文件,故创建软链:
sudo ln -s /usr/local/lib/libbrotlienc.so.1 /lib/libbrotlienc.so.1
准备源代码
下载nginx和ngx_brotli的源代码:
wget http://nginx.org/download/nginx-1.10.1.tar.gz
git clone 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 -name ngx_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段中添加如下两个配置:
brotli on;
brotli_static on;
再执行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判别,兼顾了判别的准确性和可扩展性,但是对于动态扩展,这个显然太严格了。 参考资料: https://blog.0x972.info/?d=2014/12/21/11/07/52-gdb-and-c-preprocessor-macro http://hua131.blog.163.com/blog/static/4531948220133275918584/ https://github.com/google/ngx_brotli
将ngx_brotli编译成动态nginx模块
https://robberphex.com/compile-ngx-brotli-as-dynamic-nginx-module/