以前から気になっていたbrotli。
Googleが開発したというこの新しい圧縮技術を使って、ウェブページの配信をもっと速くできないかと思い、いろいろ調べてみました。
結論から言うと、既存の圧縮技術であるGzipに対して、圧縮後のサイズで優位性はあるとしても
私が現在携わっている環境、Amazon LinuxにyumでインストールしているApacheでは対応していないため
インストール方法を切り替えてまで採用するほどではないと思いました。
今回はbrotli、及びApacheのmod_brotliのLinux環境でのインストールについてまとめたいと思います。
また、gzipとの比較としてベンチマークも実施したので、それについては後日別の記事にてご紹介できればと思います。
apacheの公式ドキュメントを確認すると
Apacheの2.4.26以上で利用できるようです。
私が携わっている環境(Amazon Linux)にyumで入っているhttpdは2.4.25で、アウトでした。
新しいバージョンがないか調べてみると
$ yum info httpd24
Installed Packages
Name : httpd24
Arch : x86_64
Version : 2.4.27
Release : 3.75.amzn1
Size : 4.1 M
Repo : installed
From repo : amzn-main
Summary : Apache HTTP Server
URL : http://httpd.apache.org/
License : ASL 2.0
Description : The Apache HTTP Server is a powerful, efficient, and extensible
: web server.
2.4.27、ということでいけそうです。
yum update httpd24
でアップデートさせます。
gzip圧縮のモジュールであるmod_deflatellのように
SetOutputFilter BROTLI_COMPRESS
をconfファイルに追記して再起動します。
ところがブラウザで確認してみるも、レスポンスヘッダーには"br"の文字列がありません。
圧縮がかかっていないようです。
そこでapacheのエラーログを見てみると、
an unknown filter was not added: BROTLI_COMPRESS
というエラーが出力されていました。
そこで/etc/httpd/modules配下を探してみるもmod_brotli的なものはありません。
yumでアップデートしても入っているわけじゃないみたいですね。
ということでソースからインストールしてみようと思います。
mod_brotliをソースからコンパイルしてインストール
まずはbrotliのレポジトリをクローンします。
記載されている手順通り、cmakeでインストールします。
(cmakeはなかったのでyum install cmake
してます)
git clone https://github.com/google/brotli
mkdir out && cd out
../configure-cmake
make
make test
make install
これで/usr/local/bin
にbrotliがインストールされます。
次にApache Httpdをソースからコンパイルしてインストールします。
こっからソースをダウンロードして伸長。
思えばapacheをソースからインストールしたのは初めてです。
brotliを使いたいので--with-brotli
オプションを指定してconfigureします。
./configure --with-ssl --with-mpm=prefork --enable-rewrite --with-brotli=/usr/local
make
make install
すると/usr/local/apache2
にhttpdがインストールされます。httpd.confを見ると
#LoadModule brotli_module modules/mod_brotli.so
があるので、こいつをコメントイン。modulesの下を探してみると。
/usr/local/apache2/modules/mod_brotli.so
があるのを確認できると思います。
いよいよapacheを起動してみようと思います。
/usr/local/apache2/bin/apachectl -t
httpd: Syntax error on line 106 of /usr/local/apache2/conf/httpd.conf: Cannot load modules/mod_brotli.so into server: libbrotlienc.so.1: cannot open shared object file: No such file or directory
何かがうまく行っていないようです。
ここで結構つまづいたのですが、調べてみたところ
ライブラリ関係がうまくいってなかったようです。
echo /usr/local/lib > /etc/ld.so.conf.d/usr-local-lib.conf
ldconfig
これできちんとapacheがmod_brotli.soを認識してくれるようです。
適当なconfファイルに以下を追記する。
SetOutputFilter BROTLI_COMPRESS
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-brotli
ブラウザで確認すると・・・。
Response Headerの"Content-Encoding"のところに"br"が見えました!
Gzipとの比較をしてみました。