AWS EC2でのHTTP/2 or SPDY導入方法

東京でウェブオペレーションエンジニアをしている id:dekokun です。

ここ数年、HTTP/2 or SPDYが話題ですよね。nginxが1.9.5からSPDY対応を切ってHTTP/2の設定ができるようになったり、はてなでも以下ブログにも記載されているように、SPDY or HTTP/2も積極的に導入していっています。

developer.hatenastaff.com

先日、AWSの環境にてSPDYを導入したのですが、導入していくまでにはやはり若干の苦労がありました。そこで、SPDY or HTTP/2をどのように導入していったか及びそこで起きた問題点の解決策等をまとめようと思います。

なお、この記事では"HTTP/2 or SPDY"と書いていますが、SPDYはHTTP/2にその座を譲ろうとしている立場となっています。具体的には、今年の5月にChromeがSPDYのサポートを切るようです。もうすぐですね。私もSPDYで運用しているサービスをHTTP/2に変えていくことを予定しています。

jp.techcrunch.com

AWS環境における導入方法

基本的には以下2つを行うだけでいけます。簡単ですね。

  • ELBでTCP modeを有効にする
  • nginx の listen ディレクティブの書き換え(及びTLS対応)

なお、上記からわかるように、この記事はELB + nginxの環境を対象にしています。

proxyサーバは他にもh2oを使う等の方法があるかと思いますが今回は扱いません。

また、今回はロードバランサにELBを指定していますが、他の方法としてhaproxyやnginxにEIPを付与してL7ロードバランサとして活用する、LVSを使用するなども考えられます。しかしそれらを使うとロードバランサ自身の冗長化をどうするかなど悩まなくてはいけなくなります。ELBであれば冗長化についてはAWSに任せることができますので、基本的にELBを使っていけばいいかなと思います。ということで、今回はELBを使用する場合の例を出しています。

ELBの設定

まず、ELBの下にnginxをぶら下げる設定を行う必要があります。残念なことに、ELBはまだHTTP/2 or SPDYには対応していないため、ELBにL7レイヤのプロトコルを喋らせるとシステムをHTTP/2 or SPDYに対応させることはできません。 ですので、ELBの設定のプロトコルの選択時に"TCP"を選んで、nginxが直接クライアントとHTTPS(HTTP/2 or SPDY)通信するようにします。

具体的には、以下のURLのリスナーの設定部分でHTTPではなくTCPを選ぶイメージです。

docs.aws.amazon.com

nginxの設定

nginx側は以下2点を対応すればよいです。 まずはnginxのTLS対応です。今回は上記に書いたようにELBの設定でTCPリスナーを採用していることから、ELBにTLSを解かせることはできません。ですので、nginx側でTLS対応の設定(listenディレクティブに"ssl"の指定を行う、証明書を配置する等)が必要になります。詳細は以下を見ると良いかと思います。

Configuring HTTPS servers

TLS対応さえ済めば後はlistenディレクティブにて"spdy"または"http2"と記述するだけです(spdyはnginx1.9.4までで使え、http2はnginx1.9.5以降で使えます)

イメージ。

~略~

server {
  listen       443 ssl http2;

~略~

極めて簡単ですね。HTTP/2及びSPDYの仕様としてそれらに対応していないクライアントはHTTPSにfallbackして通信するので、「対応していないクライアント向けに何か対策を入れないと閲覧できなくなる」という心配をする必要はないというのも便利なところです。

今後に向けて(この構成の問題点)

さて、上記設定だけで非常に手軽にHTTP/2 or SPDYは使用できるのですが、この設定だけしか行わなかった場合、"クライアントのIPをnginxが取得できない"という問題が起きます。そちらは"運用の課題"として今後解説していく予定ですのでお楽しみに。

追記 運用の問題についての解説を書きました: AWSでのHTTP/2 or SPDY運用の課題とPROXY protocol - Hatena Developer Blog

あとがき

この記事も含めて、私がSPDYの導入にあたって問題になった以下3個の課題をそれぞれ記事にしていく予定です。

最初は全部まとめて1つの記事にしていたのですが壮大になってきたので3つに分割しました。 この記事は上記3部作の1作目、AWS EC2上の環境へのHTTP/2 or SPDY対応の導入方法となります。2, 3作目もそのうち書きますのでお楽しみに。 今回は3部作の第1作目として軽めの内容になりました。次回から(と言っても、私が続編を書く前に誰かがこの"Hatena Developer Blog"に書くと思うので、このブログ的には次回ではないですが)はついにPROXY protocolの話をしようと思います。楽しみにしておいてください。

はてなでは、HTTP/2を導入していくぜ!というエンジニアを募集しています。 あと、私、東京でインフラエンジニアしています。東京で働きたいぜ!というエンジニアも絶賛募集中です。