AWS EC2に設定してHTTP2の効果を実感した


mediba advent calendar 2016 14日目の記事です。

サーバサイドpushが出来たり、画像やCSSのダウンロードをするときに順番待ちをしなくて良くなり、表示速度が早くなる!
というHTTP2を今更ながら体感したく、昨日あだちんも紹介してくれた検証/研究用のAWSインスタンスに設定して動作を見てみました。

もちろん今ではCloudFrontを用意してポチッとやればHTTP2通信してくれるようになったわけですが、
そこはフロントエンジニアとはいえど自前で一度くらいは構築しておきたいと、興味本位で実施しました。

環境

サーバ

  • AWS t2.small

OS

  • AmazonLinux

M/W

  • nginx/1.10.1
  • OpenSSL 1.0.2j 26 Sep 2016

やったこと

nginxのVerUp

nginxは1.9.5以降HTTP2対応とのことでした。
とりあえず楽にやってしまおうと、
sudo yum search nginx
したところAmazonレポジトリに1.10.1がありました。

しかしHTTP2の動作にはOpenSSL1.0.2以上が必要で、nginxをリンクしてコンパイルする必要があります。
AmazonレポジトリではOpenSSLが1.0.1であり、nginxもこれを使ってコンパイルされていました。
そこでOpenSSLをVerUpすることにしました。

OpenSSLのVerUp

yumではインストール出来ないのでコンパイルしました。

wget https://www.openssl.org/source/openssl-1.0.2-latest.tar.gz
sudo tar -zxf openssl-1.0.2-latest.tar.gz 
    〜略〜
$ openssl version
OpenSSL 1.0.2j  26 Sep 2016

nginxのVerUp(再)

当然、VerUpしたOpenSSLをつかってコンパイルしなくてはなりませんのでyumは使いません。
ソースコードをダウンロードしてコンパイル、上書きインストールしました。

sudo ./configure --prefix=/usr/share/nginx --with-http_ssl_module --with-http_v2_module --with-stream_ssl_module  --with-openssl=/usr/local/src/openssl-1.0.2j 

コンパイルオプションは色々省略しています。

conf書き換え

confでSSLを有効とし、(元から設定済みでした)
HTTP2を設定しました。

HTTP2は仕様上http通信でも有効になるのですが、ブラウザ側でhttpsの場合のみ有効になるように実装されておりSSL設定が必要になります。

server {
    listen       80;
    listen       8080;
    listen       443 ssl http2 default_server;
    server_name  xxxx.mediba.jp;
    #server_name  localhost;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/xxxx.mediba.jp/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/xxxx.mediba.jp/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
    〜略〜
}

reload

    $ sudo /etc/init.d/nginx configtest
    $ sudo /etc/init.d/nginx reload
    nginx を再読み込み中:                                      [  OK  ]

動作確認

Protocolがh2(http2)になっていることが確認できました。

思ったより簡単にサーバの設定ができました。
nginxの設定だけなので実際には色々考慮する必要があるのだろうと思います。
コンパイルは久々にやったのでダルかったです。。。

HTTP2の威力を見てみる

画像がたくさんあるページを用意し、アクセスしてみました。

HTTP1.1でアクセス

HTTP2でアクセス

結果

ネットワークやサーバの負荷、環境の違いがありますので単純な速度比較は出来ませんが、
http2では、http1.1で発生しているセッション数上限によるQueueing(透明なところ)がなくなり、
画像を並列にダウンロードしていることがわかります。

今回のアクセスでは最大500msecのQueueingが発生しており、これが無くなるとして単純に0.5秒高速化できるはずです。
かなりの効果が見込めますね!