圧縮アルゴリズムBrotliとは?導入方法とメリット【nginx】

nginxのロゴ

2015年に発表された新しめの圧縮アルゴリズムである、Brotliを試してみたのでメモ。

nginxでの導入方法と、従来の圧縮アルゴリズムであるgzipと比較した場合のメリットについてまとめました。

Brotliとは?

Brotliの特徴

brotliは2015年に発表され、その後Googleによってアップデートされたデータ圧縮アルゴリズムです。

httpにおける圧縮アルゴリズムとして使われることを主な目的としています。従来から広く使われているgzipと比較して、圧縮率が向上していながら、圧縮/伸長速度は同程度を維持しています。ただし、SSL/TLSが必須となっています。どの程度圧縮率が向上しているのかは、Brotilの効果を参照。

圧縮に辞書を併用しているのが特徴で、辞書には”<div/>”、”before”、”普通”などの頻繁に使われるHTMLタグや各言語の表現が約1万語入っており、圧縮をより効率的にしています。

ちなみに、辞書の中身はhttps://gist.github.com/klauspost/2900d5ba6f9b65d69c8eで見ることができます。

対応状況

各ブラウザのBrotliへの対応状況

ブラウザごとのBrotliへの対応状況(クリックで拡大 caniuse.com)

IE以外の主要ブラウザは1,2年前から対応しており、大部分のクライアントが対応可能です。

主要サイトでは、Google、YouTube、Facebookなどが対応しています。

もちろん従来のgzipと併用することができるので、対応状況の問題はないでしょう。

nginxでBrotliを有効にする方法

CentOS での方法を解説します。

公式yumリポジトリからインストールしたnginxでは今のところBrotliが使えないので、ソースからビルドしてインストールすることになります。

Brotliを有効にするには、ngx_brotliというモジュールを組み込む必要があります。

必要パッケージのインストール

nginxとngx_brotliをビルドするのに必要なパッケージをインストールします。

$ yum install gcc pcre-devel zlib-devel openssl-devel git

ngx_brotliのダウンロード

#作業用ディレクトリへ移動
$ cd /usr/local/src/

#ngx_brotliのダウンロード
$ git clone https://github.com/google/ngx_brotli.git

#依存パッケージ(brotli)のダウンロード
$ cd ngx_brotli
$ git submodule update --init

nginxのダウンロード

https://nginx.org/en/download.html より、Mainline version 最新版のURLを確認。

#ダウンロード
$ cd /usr/local/src/
$ curl -O https://nginx.org/download/nginx-1.15.8.tar.gz

#展開
$ tar fxz nginx-1.15.8.tar.gz
$ rm -f nginx-1.15.8.tar.gz

nginxのインストール

$ cd nginx-1.15.8

#ビルドオプションの設定(詳細は後述)
$ ./configure --prefix=/opt/nginx --user=nginx --group=nginx \
--with-http_ssl_module --add-module=/usr/local/src/ngx_brotli

#ビルド&インストール
$ make
$ make install

./configure で、インストール場所等の設定を行います。

各ビルドオプションの設定内容を簡単にまとめておきます。赤字の項目は必須項目です。

オプション 設定内容
–prefix nginxのインストール先
–user ワーカープロセスの実行ユーザー
–group ワーカープロセスの実行グループ
–with-http_ssl_module SSL/TLSのサポートを有効にする
–add-module モジュールを有効にする(ngx_brotliの指定が必須)

nginxの設定

nginx.conf の設定のほかにも、yumでインストールした場合自動でやってくれる作業も、手動で行う必要があります。

ワーカープロセスの実行ユーザーの作成

nginxというユーザーがまだ作られていなければ、作成します。

$ useradd -M -s /sbin/nologin nginx

ユニットファイルの作成

systemctl から起動や停止ができるように、ユニットファイルを作成します。

$ sudo vi /usr/lib/systemd/system/nginx.service

ユニットファイルは下記のように記述します。

インストール場所を/opt/nginxから変更した場合は、PIDFileとExecStartのパスも変更してください。

[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/opt/nginx/logs/nginx.pid
ExecStart=/opt/nginx/sbin/nginx -c /opt/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

nginx.confの設定

nginxの設定ファイルは、/opt/nginx/conf/nginx.conf です。

SSL関連の設定例では、デフォルトから最低限変更する必要がある項目のみを挙げています。

http {
    #Brotli関連の設定
    brotli            on;
    brotli_types      text/css text/javascript application/javascript;
    brotli_min_length 1024;
    brotli_comp_level 6;

    #SSL関連の設定
    server {
        listen       443 ssl;
        server_name  <サーバーのFQDN>;

        ssl_certificate      <サーバー証明書のパス>;
        ssl_certificate_key  <サーバー秘密鍵のパス>;
        }
}

Brotli関連の設定項目は、gzipの設定とよく似ています。

以下、よく使うであろう設定項目の解説です。

完全な一覧は、https://github.com/google/ngx_brotliを参照のこと。

設定項目 既定値 設定内容
brotli off Brotli圧縮の有効/無効の切り替え
brotli_types なし

text/html 以外に圧縮の対象とするMIMEタイプを指定する。

image/png や image/jpeg など、既に圧縮されているものは指定しないこと。

brotli_min_length 20

圧縮の対象となるファイルサイズの最小値を指定する。(単位:バイト)

小さすぎるファイルは、効果が圧縮のオーバーヘッドに見合わないので除外する。

brotli_comp_level 6

圧縮レベルを0~11で指定する。値が大きいほど圧縮率が向上するが圧縮速度は低下する。

以上で、ngnixをBrotliに対応させる準備は完了です。

動作確認

nginxを起動したら、ブラウザからアクセスしてBrotliで圧縮されているか確認します。

Chrome、Firefox、Edgeから確認することができます。

①対象のサーバへアクセスする

②開発者ツールを開いて、レスポンスヘッダの content-encoding が br になっていることを確認する

chromeのデベロッパーツール画面

Chromeのデベロッパーツールの場合

Chrome の場合デベロッパーツール を開く(Ctrl + Shift + I)→ Network タブを選択 → ページを更新する → 対象のファイルを選択 → Response Headers を参照

Firefox の場合:ウェブ開発の ネットワーク を開く (Ctrl + Shift + E) → ページを更新する → 対象のファイルを選択 → 応答ヘッダー を参照

Edge の場合開発者ツール を開く(F12) → ネットワーク タブを選択 → ページを更新する → 対象のファイルを選択 → 応答ヘッダー を参照

Brotliの効果

圧縮率について

実際どれほど圧縮率が向上しているのか、gzipと比較してみました。

検証には、当ブログの記事TLS1.3に対応したApache(httpd)のインストール・設定方法のHTMLファイルを使いました。

圧縮レベル gzip の圧縮率 Brotli の圧縮率 圧縮向上率
0 31.1%
1 30.8% 30.5% 1.0%
2 29.9% 28.7% 4.1%
3 29.2% 28.2% 3.5%
4 27.7% 26.5% 4.5%
5 26.9% 24.2% 11.2%
6 26.9% 24.1% 11.6%
7 26.9% 23.7% 13.5%
8 26.8% 23.7% 13.1%
9 26.8% 23.6% 13.6%
10 22.4%
11 22.1%

圧縮率は(圧縮後のサイズ / 圧縮前のサイズ)、圧縮向上率は(gzipの圧縮率 / Brotliの圧縮率)で算出しています。

圧縮レベルが高くなるにつれて圧縮率は向上し、レベル5以上になると圧縮率が1割強向上しています。gzipの場合、ある程度までレベルが上がるとそれ以降はほとんど圧縮率が向上しないことがこの差の要因になっているようです。

圧縮/伸長速度について

圧縮/伸長にかかる時間は、レベル9まではgzipとほぼ同等のようですが、レベル11になると劇的に遅くなるようなので、圧縮レベルは9までに抑えておくのが無難です※1brotli_static を利用してあらかじめ圧縮してあるファイルを転送する場合は例外です。

参考:http://www.gstatic.com/b/brotlidocs/brotli-2015-09-22.pdf

まとめ

  • Brotliは、IE以外の主要ブラウザですでに対応しており、利用できるクライアントは多い
  • 現状nginxでBrotliに対応するには、ソースコードから自分でビルドしたものを使う必要がある
  • gzipと比較して約1%~14%圧縮率が向上している

脚注   [ + ]

1. brotli_static を利用してあらかじめ圧縮してあるファイルを転送する場合は例外です。

あわせて読みたい

コメントを残す

質問・感想などお気軽にどうぞ。
*が付いている項目は入力必須です。メールアドレス以外の項目が公開されます。
スパム防止のため、コメント反映まで少々時間がかかります。