nginxをhttp/2に対応させるためにトライしたこと

2018/08/09

最近暑い日が続いています。ってサラっと言えないくらいエグい暑さ。
さて、これまで本ブログのWebサーバnginxはhttp/1.1プロトコルで動作していたのですが、この度https/2.0プロトコルにて動作できるようになったので、設定するまでの手順を記録していきます。

 

http/2対応って何をどこまで?

nginxでhttp/2で通信するためには以下の構成が必要らしいです。

・nginx version: 1.9.5以上
・openssl version: 1.0.2以上

厳密にはopensslはデフォのバージョンのもの ( OpenSSL 1.0.1e-fips 11 Feb 2013 ) でもhttp/2が使えるのですが、Chromeブラウザではhttp/2通信をするのにALPN ( Application Layer Protocol Negotiation ) 仕様でネゴシエーションします。デフォのopensslではこれに対応できず、openssl 1.0.2以上でないと対応しないので、今回はopensslもアップグレードします。

参考:Supporting HTTP/2 for Website Visitors via nginx.com

 

触る前の構成

・Linux 4.14.3-1.el6.elrepo.x86_64

・CentOS 6.9 (Final)

・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'

 

OpenSSL

# cd /usr/local/src
# wget https://www.openssl.org/source/openssl-1.0.2-latest.tar.gz
# tar -zxf openssl-1.0.2-latest.tar.gz
ここで解凍されたopensslのバージョンを確認する。あとで使うので。


nginx

作業に先立ち、nginxは停止させる。
# /etc/rc.d/init.d/nginx stop

# cd /usr/local/src
# wget http://nginx.org/download/nginx-1.14.0.tar.gz
# tar -zxf nginx-1.14.0.tar.gz

この後、nginxをコンパイルするのだけれど、
これまで使用していたnginxのコンパイルオプションをそのまま使用します。
その際に、先ほど準備したopenssl 1.0.2のフルパスを追記して下さい。


# ./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-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' --with-openssl=/usr/local/src/openssl-1.0.2

コンパイルエラーとなった場合、必要なライブラリがインストールされていない場合がほとんどだと思うので、エラー出力を確認して必要なライブラリをyumでインストールします。うちの環境では以下のライブラリが不足していたのでyumでインストールしました。

# yum install pcre-devel
# yum install libxslt-devel
# yum install gd-devel
# yum install GeoIP-devel

コンパイルが進みプロンプトが返ってきた次に進む。
# make
# make install

これでインストール完了なのでnginxを起動させる。
# /etc/rc.d/init.d/nginx start

あとは各nginx配下のWebサーバ毎のlistenディレクティブに http2 を追記するだけ。
例: listen 443 ssl http2;

yumでnginxをインストールしている場合はnginx.repoの無効化をお忘れなく。
yum updateの時にnginxがアップデートされると、どうなってしまうかわかりません。

 

対応できたかな確認

以下のWebサービスで ALPN対応を含めた http/2 確認テストができるみたいなのでやってみました。
Online HTTP/2 test via keycdn.com

http/2もALPNも有効になっているみたいで良かったです。

 



					

adsense under_kizi


adsense_ bottom_kizi336


関連記事

シェア訴求文言

☆僕の記事はどうしたか?共感していただけたら、シェアしてもらえるととても嬉しいです!
読んでくれる方の数が多くなると、為になる記事を書こうという気持ちが高くなりますのでよろしくお願い致します!

-CentOS
-, , , , ,