将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来搞定了。

阅读更多

《一日重生》

人生总是有很多不如意。 查理在失意许久之后,决定自杀,来结束这些痛苦。意外之中,他的母亲出现了,他和他母亲度过了一天。 这一天看起来是平常的一天,去给别人理发,给塞尔玛小姐化妆等。在平淡的叙事中,加上查理自己的回忆,查理看到了很多小时候被遗忘、被忽略的事情。 确实,查理一心只想追求父爱,忽略了母爱;等到母亲去世之后才知道母爱的珍贵,此后人生的曲折,只能自己一个人去面对。 遗憾的是,查理面对的,仅仅是母亲的灵魂,唯一能改变的,只能是自己。 那天晚上,母亲带着他去见了父亲的第一任妻子,她说出了“原谅”这个词。 过去的恩怨,我们没有机会去讨回、去复仇,现在能做的,也就只有原谅,要原谅的,不是别人,恰恰是自己。


  查理是幸运的,他还有机会去重新经历一遍,了解过去、了解自我。 对于我们,就像书中母亲说的一样:

回到过去,比你想象的要难。

阅读更多

Violet?Purple?

这两个单词都是紫色的意思。突然想到这个有什么区别,所以查了下,还真有。 Violet得名于紫罗兰(紫罗兰的英文也是violet),是一种真正的颜色,有自己的波长(380–450 nm) 而Purple则是蓝色和红色的混合色。相比Violet,Purple更偏向于贵族的意味。


这是violet:   Violet 这是purple: purple


references: Violet (color) Purple

阅读更多

用Python 2/3建立最简单的web服务器

在Python 2.x中,可以用如下的命令启动一个最简单的Web服务器(默认端口号8000):

python -m SimpleHTTPServer [端口号]

接下来直接访问 http://localhost:\[端口号\] 即可 在Python 3.x中,这几个模块都已经改名了,如果需要如上的功能,可直接换用如下命令:

python3 -m http.server [端口号]

参见: http://stackoverflow.com/a/7943768

阅读更多

Fedora 20 Release Party Shanghai Report

The Fedora 20 Release Party in Shanghai was successfully held at 联合创业办公社 on Dec 22. It was organized by Fedora Zhongwen User Group and Shanghai Linux User Group. The release party began at 1:20 pm. (It was late for about 20 minutes.) After a short Opening address by me, speakers start talks. The first talk is “Fedora.prev & Fedora.next” by Robin Lee(a Fedora packager and skilled programmer). He introduce the new model of Fedora package system: Split single repository into four Ring. And organize some working group to maintain Ring. That model makes Fedora more friendly for other company. [caption id=”attachment_260” align=”aligncenter” width=”300”]“Fedora.prev & Fedora.next” by Robin Lee “Fedora.prev & Fedora.next” by Robin Lee[/caption] The second talk is about Fedora ARM by Fu Wei(a Software Engineer, in Fedora ARM team). He introduce how to make rpm package and image for ARM, some ARM server(Linaro). Then, He introduce LAVA, a automated test platform for ARM. [caption id=”attachment_262” align=”aligncenter” width=”300”]Fedora ARM by Fu Wei Fedora ARM by Fu Wei[/caption] After talks, the pizz is arrived, we start free talk, every talk about some Technical point, such as Python, Perl, OpenStack, etc. [caption id=”attachment_264” align=”aligncenter” width=”300”]free talk free talk[/caption] Last, we take a group photo. [caption id=”attachment_265” align=”aligncenter” width=”300”]Group Photo Group Photo[/caption] It is worth pointing out several issues for the event. The pizzas was sent earlier than the end of talks. There is not Registration. So to avoid the issues:

  • To prepare better, submit the budget earlier.
  • Contact the speaker before party.
阅读更多

用reveal.js+markdown制作树型结构的slides

reveal.js 可以让你制作出基于网页的slides,轻量级,跨平台,非私有格式。 说来惭愧,我做的大多slides都是想表达这样的结构: image1 于是,就做出了这样的slides: image2 我们姑且称这样的slides为“树型结构slides”。我们要用 reveal.js来制作这样的 slides 。 fork项目:

git clone git://github.com/hakimel/reveal.js.git

然后修改index.html文件,把class为slides的div元素换为如下div元素(覆盖掉原来的div元素及其子孙元素)

data-separator=”^\n\n\n”表示用三个连续的换行作为横向分隔符(即顶层slide之间的分隔),data-vertical=”^\n\n”表示用两个个连续的换行作为纵向分隔符(即第二层slide之间的分隔)。 举例如下:

使用方法:首先展示开始页,按右或者回车显示下一页,按左显示上一页,按上下显示相应页面子页面。Esc显示概览。 如图: image3 不足:

需要slides作者有html/css基础。

加载时需要下载网页字体(这个可以先用离线模式解决,日后联系开发者解决)

只适用于“扁平”状的slides,如果层数太多,展示效果不好。

阅读更多