将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

Leave a Reply

Your email address will not be published. Required fields are marked *

25 − 18 =