この記事は、nginx Advent Calendar 2015の1日目の記事です。
Brotli
BrotliはGoogleが最近公開した新しい圧縮アルゴリズムとその実装です。zopfliと違って従来のよく利用されているdeflateアルゴリズムと互換性はありませんが、deflateアルゴリズムと同じくくらい高速でなおかつ圧縮率がさらに向上しているのが特徴です。
今回はこのBrotliによるコンテンツ圧縮をnginxで利用する方法について紹介します。
ngx_brotli
ngx_brotliはngx_http_gzip_moduleおよびngx_http_gzip_static_moduleのbrotli版に相当するnginxモジュールです。以下のようにnginxでgzip圧縮をしたことがある人ならなんとなくどう使うかわかるディレクティブがあります。(ディレクティブはほかにもいろいろとあります。詳しくはngx_brotliのREADME.mdを参照して下さい)
ディレクティブ名 | 値 | 解説 |
---|---|---|
brotli | on | off | brotliによる圧縮を有効/無効にする |
brotli_types | mime-type ... | 圧縮対象のMIME typeを列挙する |
brotli_static | on | off | always | 事前にbrotliで圧縮したファイルを配信する |
libbrotliをインストールする
ngx_brotliをインストールするには事前にlibbrotliをインストールする必要があります。
$ git clone https://github.com/bagder/libbrotli
$ cd libbrotli
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
ngx_brotliをインストールする
続いてngx_brotliをインストールする。nginxのモジュールはnginx本体と一緒にビルドしなければならないのでここではnginx-buildを使ってインストールする。
$ brew tap cubicdaiya/nginx-build
$ brew install nginx-build
$ echo "[ngx_brotli]\nform=git\nurl=https://github.com/google/ngx_brotli.git" > modules3rd.ini
$ nginx-build -d work -v 1.9.7 -m modules3rd.ini
$ cd work/nginx/1.9.7/nginx-1.9.7
$ sudo make install
次にnginx.conf
に以下の設定を書く。
server {
listen 8080;
root html;
brotli on;
}
これでリクエストヘッダにAccept-Encoding: br
を付けてindex.htmlをリクエストすると、
$ curl -H "Accept-Encoding: br" -I http://127.0.0.1:8080/index.html
HTTP/1.1 200 OK
Server: nginx/1.9.7
Date: Mon, 30 Nov 2015 14:41:29 GMT
Content-Type: text/html
Last-Modified: Wed, 06 Aug 2014 17:07:04 GMT
Connection: keep-alive
ETag: W/"53e260b8-264"
Content-Encoding: br
$
という具合にContent-Encoding: br
となってるのが確認できます。