LoginSignup
35

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-06-27

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35