ウェブサイトを配信するにあたり、gzip
や、Zopfli
で圧縮することがありますが、
それよりもより圧縮率の高いbrotli
という形式があります。
brotliもZopfliと同じく、Googleが開発した圧縮アルゴリズムです。
Zopfli
よりも圧縮率が高い上に、解凍効率もほとんど変わらないようです。
一方、圧縮時間はZopfliよりも増大するため、オンザフライでの配信は向かないようです。
また、brotliはSSL環境でないと動作しません。 そして、IEも対応していない(Edgeは対応しています)ので、導入要件はZopfliよりも多少高いと言えます。
ただ、色々と試したいと思い、nginxでbrotliを使うためにyum
ではなくソースからインストールしました。
brotliモジュールをダウンロード
nginxのbrotliモジュールを取得します。
リポジトリ:https://github.com/google/ngx_brotli.git
clone先は/usr/local/src
にしました。
場所はどこでも構いませんが、ソースからパッケージをインストールする場合は、
/usr/local/src
へソースを展開して作業するのが一般的です。
$ sudo yum update -y nss curl
$ cd /usr/local/src
$ sudo git clone git://github.com/google/ngx_brotli.git
$ cd ngx_brotli
$ sudo git submodule update --init
nginxをダウンロード
nginxをダウンロードします。特に理由がなければmainlineの最新版が良いと思います。
http://nginx.org/en/download.html
$ cd /usr/local/src
$ sudo wget http://nginx.org/download/nginx-1.13.12.tar.gz
$ sudo tar zxvf ./nginx-1.13.12.tar.gz
nginxのバージョンとconfigureを確認
yum
でインストールした時と同じオプションで設定したいので、オプションを確認します。
$ nginx -V
nginx version: nginx/1.10.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/var/run/nginx.pid --lock-path=/var/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-http_perl_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-debug --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --with-ld-opt=' -Wl,-E'
configure
は以下になります。これを後ほど使います。
--add-module=/usr/local/src/ngx_brotli
を末尾に追加しました。
また、--with-ipv6
は非推奨らしいので削除しました。
sudo ./configure \
--prefix=/usr/share/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib64/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/lib/nginx/tmp/client_body \
--http-proxy-temp-path=/var/lib/nginx/tmp/proxy \
--http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi \
--http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi \
--http-scgi-temp-path=/var/lib/nginx/tmp/scgi \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/subsys/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_xslt_module=dynamic \
--with-http_image_filter_module=dynamic \
--with-http_geoip_module=dynamic \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_slice_module \
--with-http_stub_status_module \
--with-http_perl_module=dynamic \
--with-mail=dynamic \
--with-mail_ssl_module \
--with-pcre \
--with-pcre-jit \
--with-stream=dynamic \
--with-stream_ssl_module \
--with-debug \
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' \
--with-ld-opt=' -Wl,-E' \
--add-module=/usr/local/src/ngx_brotli
必要なパッケージをインストール
必要なライブラリは、オプションや環境によって適宜変更してください。
$ sudo yum install -y pcre pcre-devel
$ sudo yum install -y openssl openssl-devel
$ sudo yum install -y libxslt-devel
$ sudo yum install -y gd-devel
$ sudo yum install -y perl-ExtUtils-Embed
$ sudo yum install -y GeoIP-devel
上記をまとめてインストールするなら以下のコマンドになります。
$ sudo yum install -y pcre pcre-devel openssl openssl-devel libxslt-devel gd-devel perl-ExtUtils-Embed GeoIP-devel
nginxインストール
configure
は先程作っておいたコマンドを使います。
$ cd nginx-1.13.12
$ sudo ./configure \
--prefix=/usr/share/nginx \
--sbin-path=/usr/sbin/nginx \
...
--add-module=/usr/local/src/ngx_brotli
$ sudo make && make install
バージョン確認
configureの末尾に--add-module=/usr/local/src/ngx_brotli
が追加されました。
$ nginx -V
nginx version: nginx/1.13.12 <- バージョン上がった
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/share/nginx ... --add-module=/usr/local/src/ngx_brotli <- 追加された
confファイル設定
confファイルを設定します。動くかどうかを確認したいだけなので、nginx.conf
を直接編集してしまいます。
botrliは圧縮すると.br
という拡張子になります。
今回は予め.br
を用意するという想定で設定しました。
$ vim /etc/nginx/nginx.conf
http {
...
server {
...
brotli_static on;
...
}
...
}
起動ファイル生成
次にnginxの起動ファイルを作成します。以下のページのスクリプトをコピーして新規作成します。
https://www.nginx.com/resources/wiki/start/topics/examples/redhatnginxinit/そして、実行権限も付与して、nginxを起動します。
$ vim /etc/init.d/nginx
$ chmod +x /etc/init.d/nginx
$ sudo service nginx start
確認
.br
ファイルを設置してい確認します。
テスト用に.br
ファイルを用意しました。中身はほぼ空っぽのhtml
です。
テスト用ファイル:test.html.br
$ mv ./test.html.br /usr/share/nginx/html/test.html.br
$ curl -H "Accept-Encoding: br" -I http://127.0.0.1/test.html
HTTP/1.1 200 OK
Server: nginx/1.13.12
Date: Tue, 12 Jun 2018 05:12:40 GMT
Content-Type: text/html
Content-Length: 80
Last-Modified: Fri, 08 Jun 2018 08:21:22 GMT
Connection: keep-alive
ETag: "5b1a3c82-50"
Content-Encoding: br <- brになっている
参考サイト
Nginxインストールメモhttps://qiita.com/nenokido2000/items/3cbb76dac2b9940f339e
nginxのコンパイルメモ
https://qiita.com/kei75/items/b3ea3012ed71ab2f5c2c