圧縮アルゴリズムBrotliとは?導入方法とメリット【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で見ることができます。
対応状況
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 の場合:デベロッパーツール を開く(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 を利用してあらかじめ圧縮してあるファイルを転送する場合は例外です。 |