西部数码主机 | 阿里云主机| 虚拟主机 | 服务器 | 返回乐道官网
当前位置: 主页 > 开发教程 > linux教程 >

将ngx_brotli编译成动态nginx模块

时间:2016-06-12 13:33来源:未知 作者:好模板 点击:
Brotli是google新出的一个压缩算法,据说比Zopfli的压缩率要高2026%(Zopfli是google之前发布的一个和Deflate兼容的压缩算法)。 Chrome 49+、Firefox 44+以及Opera 36+都支持Brotli了,所以,是时候尝试

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判别,兼顾了判别的准确性和可扩展性,但是对于动态扩展,这个显然太严格了。

(责任编辑:好模板)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
热点内容