nginx
openssl
http2

EC2+nginxでhttp2対応できたとおもったらできてなかった話。(解決します)

More than 1 year has passed since last update.


ssl対応でサイトパフォーマンスがあがるらしい

あるサイトのはじめてのSSL対応の作業中、「SSL対応するとはやくなるで!!という記事を見つけました。

いわく、


Web サイトのパフォーマンスについて、「SSL 化でパフォーマンスが悪化する可能性」 と、一方で 「HTTP/2 や SPDY が利用可能な状況では SSL 化でパフォーマンスが向上する可能性」 という両方の可能性


だそうです。

なるほど、本来ならSSLで接続するとパフォーマンスが悪化する(SSLハンドシェイクなどによる)けど、HTTP/2やSPDYを使うとパフォーマンスが向上するんか!

じゃあSSL接続もさることながら、HTTP/2やSPDY対応させなければ!!


SPDYでサイトにアクセスできるようにする

EC2上で動いているnginxのバージョンをたしかめてみたところ、1.8.1とのこと。

めでたくSPDYに対応しておりました。

SSL化をチャチャッと済ませて、SPDY対応したろ〜と、とりあえずSPDYに対応させました。


hoge.conf

server {

listen 443 default ssl spdy;
ssl on;
ssl_certificate /etc/nginx/ssl/server.ssl.pem;
ssl_certificate_key /etc/nginx/ssl/server.key;
:
:

よっしゃこれではやくなるわ!!

とおもっていた矢先でした。


ChromeのSPDYサポートが終了(していた)


今、Googleは同社のブラウザー、ChromeからSPDY対応を外す準備が整い、5月15日でChromeのSPDYサポートを終了すると発表した。

Chrome、SPDYのサポートを5月15日に終了 | TechCrunch Japan


わあ〜〜〜。

ま、まあ落ち着いてgoogle analytics見てみよう...。chrome少なければ良いよね別に...。

スクリーンショット 2016-06-27 20.21.50.png

ですよね。

少ないわけもなく、HTTP/2に対応せざるを得んと心の中で決意するのでした。


nginxのアップデート

さて、SPDYをあきらめて、HTTP/2の対応をしていきます。


前置き

この項は、新しくnginxをインストールする際にopensslを指定しないといけないと気づいただけなので、流し読み程度で大丈夫です。


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

HTTP/2をnginxで対応させるためにはバージョン1.9.5からだそうです。

EC2上のnginxは前述の通り1.8.1

残念なことに対応していなかったのでアップデートします。

# yum update nginx

が!

EC2(Amazon linux)の標準リポジトリではnginxの最新バージョンが1.8.1ですので、アップデートできませんでした。

なのでソースからインストールしていきます。

$ sudo yum install pcre pcre-devel pcre-devel zlib-devel openssl-devel

$ wget http://nginx.org/download/nginx-1.10.1.tar.gz
$ tar -xvzf nginx-1.10.1.tar.gz
$ cd nginx-1.10.1
$ ./configure --with-http_ssl_module --with-http_v2_module
$ make
$ sudo make install

/usr/local/nginx/sbin/nginxにインストールされているので

/etc/init.d/nginxを変更しときましょう。

$ nginx -v

nginx version: nginx/1.10.1

できた!

HTTP/2に対応するnginxだ!!

設定ファイル編集もできた!


hoge.conf

server {

listen 443 default ssl http2;
ssl on;
ssl_certificate /etc/nginx/ssl/server.ssl.pem;
ssl_certificate_key /etc/nginx/ssl/server.key;
:
:


そして運命の時

ちゃんとできてるか確認のために、chromeの拡張機能を入れておきましょう。

HTTP/2 and SPDY indicator - Chrome ウェブストア

早速nginxを起動してアクセスしてみます。

スクリーンショット 2016-06-27 20.40.28.png

あれ。拡張機能壊れてるのかな??

ちなみに、firefoxだと現在(2016/06)、HTTP/2で接続をしてくれています。

(あとで気づいたのですが、chromeは2016/05/31からNPNやめてALPN一筋です。)


opensslをアップデートしなければならない

そういえば、さっきSPDYについて調べていた時に、


Googleが提案したTLSのNPN(Next Protocol Negotiation)拡張を利用することで実現しています。この拡張仕様は、現在IETFにドラフト仕様が提出されており、既にオープンソースのOpenSSLに実装されている機能です。

Web表示の高速化を実現するSPDYとHTTP/2.0の標準化 | 最新の技術・取り組み | IIJ


とありました。

さらに、


なお現在仕様検討中のHTTP/2.0では、NPNの手順を改良したALPN(Application Layer Protocol Negotiation)仕様を利用することが採用されています。

Web表示の高速化を実現するSPDYとHTTP/2.0の標準化 | 最新の技術・取り組み | IIJ


とあります。

なーるほど。opensslがALPN対応してないようです。

ここにたどり着くまでかなり時間つかいました。

例のごとくバージョンチェックです。

$ openssl version

OpenSSL 1.0.1k-fips 8 Jan 2015

案の定ですorz

ALPN対応は1.0.2からですorz

アップデートしなければなりません。

と思ったのですが、opensslを指定してnginxをインストールすることが可能ですので今回はそうします。

$ wget https://www.openssl.org/source/openssl-1.0.2h.tar.gz

$ tar -xvzf openssl-1.0.2h.tar.gz

きちんとopensslを指定してインストールします。

$ cd

$ cd nginx-1.10.1
$ ./configure --with-http_ssl_module --with-http_v2_module --with-openssl=/home/username/openssl-1.0.2h
$ make
$ sudo make install

nginxをrestartしてアクセスします。どきどき。

スクリーンショット 2016-06-27 21.04.15.png

救われました。

きちんとHTTP/2、ALPN対応したか確認したい場合は

HTTP/2 Test | A simple HTTP/2.0 test toolでどうぞ


さいごに

読みづらくてすみませんでした。

サーバーサイドのことはもちろん、文を書くのも不慣れですし、最新の情報に疎かったため非常に難儀しました。

もし、間違い、アドバイス、オススメのサイトなどありましたら、教えていただけると嬉しいです。


参考(ありがとうございました)

yum は止めて nginx をソースからインストールする | 脳無しの呟き《土鍋と麦酒と炬燵猫》

常時 SSL 化による Web サイト表示速度向上の可能性について | WWW WATCH

Web表示の高速化を実現するSPDYとHTTP/2.0の標準化 | 最新の技術・取り組み | IIJ

The day Google Chrome disables HTTP/2 for nearly everyone: May 31st, 2016