はじめに

コンテンツをサーバ側で圧縮する機能として有名なものにはgzipがありますが、最近ではBrotliと呼ばれる新たな圧縮アルゴリズムが存在しています。

これは従来のgzipよりも圧縮性能が高く、更に高速に圧縮処理が行えるという非常に優れたものです。

更に、gzip形式で圧縮できるものの中でもより圧縮性能の高いzopfliですらBrotliは超えているため、その性能は抜きん出ています。

ただし、Brotliは新しい形式であることから古いブラウザでは対応しておらず、その場合にはgzipを使う必要がありますが、最近のブラウザの多くは既に対応済みとなっています。

この記事ではUbuntu環境内でBrotliをインストールし、ウェブサーバのNginxで実際に使用するまでの方法を紹介します。

サーバのスペックおよび構成は以下の通りです。

  • $ cat /etc/lsb-release

    • DISTRIB_ID=Ubuntu
    • DISTRIB_RELEASE=20.04
    • DISTRIB_CODENAME=focal
    • DISTRIB_DESCRIPTION="Ubuntu 20.04.3 LTS"
  • Vultr : High Frequency Server

    • 32GB MVMe
    • 1CPU
    • 1GB Memory
    • Additional Features
      • Virtual Private Clouds: ON

Brotliのインストール

今回Brotliをインストールする際に使用するのは、Nginxの動的(Dynamic)モジュールであるngx_brotliです。

Nginxでは数年前までモジュールの組み込みにはNginxの再ビルドが必要となるなど、やや手間がかかっていましたが、v1.9.11で動的モジュールがサポートされたことから、比較的簡単にモジュールを追加することができます。

まずは$ nginx -vで現在使用しているNginxのバージョンを確認します(執筆時点では1.20.2)。

理由として、導入するバージョンが同じではないと整合性が合わないためにエラーが発生するからです。

バージョン確認後、$ wget https://nginx.org/download/nginx-1.20.2.tar.gzというように、現在使用しているバージョンのNginxをダウンロードします。

ダウンロードが完了したら$ tar zxvf nginx-1.20.2.tar.gzでファイルを解凍します。

次に$ git clone https://github.com/google/ngx_brotli.gitによってnginx_brotliを複製します。

そして$ cd nginx-1.20.2でディレクトリを移動します。

次に~/nginx-1.20.2$ sudo ./configure --prefix=/etc/nginx --with-compat --add-dynamic-module=../ngx_brotliを実行することで動的モジュールの追加を行います。

この時、./configure: error: Brotli library is missing from the /usr directory.というエラーが発生する場合は、コンソール上にも表示されているように~/nginx-1.20.2$ cd ../ngx_brotli && git submodule update --init && cd /home/ユーザ名/nginx-1.20.2を実行してsubmoduleのアップデートを行い、その後もう一度動的モジュールの追加コマンドを行ってください。

完了したら~/nginx-1.20.2$ sudo make modulesでモジュールをビルドします。これは少々時間がかかります。

ビルドも完了しましたら~/nginx-1.20.2$ sudo cp ./objs/*.so /usr/lib/nginx/modulesでモジュールをコピーします。

そして最後に$ sudo vim /etc/nginx/nginx.confにより、設定ファイル内に読み込む動的モジュールを追加します。

nginx.conf

## 省略 ##

# httpディレクティブより上に設置すること
load_module "modules/ngx_http_brotli_filter_module.so";
load_module "modules/ngx_http_brotli_static_module.so";

## 省略 ##

編集後は$ sudo service nginx restartでNginxを再起動します。

これでBrotliのインストールが完了しました。

Brotliの設定

インストールは完了しましたが、使用する設定を加えていないため、まだ使うことはできません。

なので、$ sudo vim /etc/nginx/nginx.conf内にBrotli用の設定を書き加える必要があります。

なお、各種設定の詳細は公式ページに記載されています。

$ /etc/nginx/nginx.confでもう一度設定ファイルを編集します。

nginx.conf

## 省略 ##

# gzipの設定と同じ所に設置するとわかりやすい

# brotliを使うにはモジュールを追加する必要がある
# 動的にbr圧縮を行う
brotli on;

# 事前圧縮されたbrファイルを相手に送る
brotli_static on;

# 指定されたMINEタイプのファイルをbr圧縮する(動的圧縮がONの場合)
brotli_types application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml;

# br圧縮で使用するバッファサイズ
brotli_buffers 32 4k;

# 動的br圧縮の強度
brotli_comp_level 1;

# 使用する辞書のサイズ
brotli_window 512k;

# 圧縮対象となるファイルサイズ
brotli_min_length 20;

## 省略 ##

設定後は$ sudo service nginx restartでNginxを再起動します。

これにより、Brotliが有効化されました。

おわりに

Brotliはgzipより優れた圧縮をより効率的に行えるため、大変便利なツールです。

また、Brotliとgzipの両方を設定していても、サーバ側はクライアントの対応有無によって柔軟に対処できます。

これを上手く使うことで、ウェブサイトのさらなる高速化に役立てることができることでしょう。

参考資料