自分のサイトをHTTP/2対応にしようとしたらものすごいはまった。

Life with open mind: コミケ90で「Get Started with HTTP/2」を出します(3日目 西4 f-44b)
これを読みまして、「よし、自分のサイトもこのビッグウェーブに乗せよう」と思い、(Raspberry Piで運用してる以外のSSLに対応してる)サイトをHTTP/2対応にしました。

サーバ弄る前にクライアントのWindows 10マシンにRS1適用したらOSごと起動しなくなって死ねって思いました。

薄いご本にはOCSP Staplingの設定や、ssl_ciphersの設定について解説してあったのですが、結構前に「SSL LabsでA+取らなきゃ(使命感)」みたいな時期があって、そこら辺は全部済ませてたので飛ばしました。

環境

OS: CentOS 7
nginx: nginx/1.11.3(yum install)→ nginx/1.11.3 (make install)
openssl: OpenSSL 1.0.1e(yum install) → OpenSSL 1.0.2h(make install)

nginx側の設定

http2に対応しているのが1.10.0以上ですが、yumで入ってるのが1.11.3なので何もしなくていい!余裕ですね。$nginx -Vで確認しても「–with-http_v2_module」がついてるので一安心です。そんなふうに思ってたら30分後に自分でビルドすることになったんですけどね。confのserverディレクティブに以下の設定をすると、http2で通信できるようになります。

listen  443 ssl http2;

あとはnginxを再起動すればOKですね。簡単。

http/2で通信してるか確認してみる

firefoxとedgeとchromeで確認してみました。
firefox以外http/1.1で通信していました。

原因を調べる

Supporting HTTP/2 for Google Chrome Users | NGINX
これでした。Chromeでhttp/2通信させようと思ったら、ALPNに対応させないといけないのですが、openssl 1.0.2以降でないと対応してないようです。薄いご本に「ALPNはopenssl 1.0.2以降じゃないと対応してないよ」って書いてあったけど、こういう理由だったんですね。(ALPNに対応させないといけない理由が本にはなかったので、そこはちょっと残念だったかも。)

必要なものをビルドする

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
nginxをビルド。

予め$nginx -Vでconfigureがどうなってるのか調べておくと良いです。

SRPMがあるからそれを使う手もあります。
Index of /packages/mainline/centos/7/SRPMS/
RPMのコンパイルオプションを変更してインストールする方法 | あぱーブログ

今回は自力でmakeしました。コマンド書こうと思ったのですが、綺麗なまでに以下の記事と同じところではまったので、記事のURLを紹介しておきます。
nginxのコンパイルメモ – Qiita
上記Qiitaと違う点として、私の環境のconfigureではnjsのバージョンは0.1.0だったため、tipではなく0.1.0を指定しました。
njs: cdb8d20935ee
configureに以下を追加して使いたいopensslの場所を指定します。

--with-openssl=/usr/local/src/openssl-1.0.2h

無事、make installできました。

結果

SSL Labsの結果
SSL Labsの結果
HTTP/2 Testの結果
HTTP/2 Testの結果

SSL Server Test: retrorocket.biz (Powered by Qualys SSL Labs)
HTTP/2 Test | A simple HTTP/2.0 test tool

いくばくか早くなったと信じています。