2018-06-12

tobijibu

nginxをソースからインストール

ウェブサイトを配信するにあたり、gzipや、Zopfliで圧縮することがありますが、 それよりもより圧縮率の高いbrotliという形式があります。

brotliもZopfliと同じく、Googleが開発した圧縮アルゴリズムです。 Zopfliよりも圧縮率が高い上に、解凍効率もほとんど変わらないようです。 一方、圧縮時間はZopfliよりも増大するため、オンザフライでの配信は向かないようです。

また、brotliはSSL環境でないと動作しません。 そして、IEも対応していない(Edgeは対応しています)ので、導入要件はZopfliよりも多少高いと言えます。

Can I use brotli ?

ただ、色々と試したいと思い、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