http2に対応

晴れ今日は会社でジョギング3.4km&家に帰ってからジョギング6kmをしてきた。 会社のがウォーミングアップになったみたいで、家で走った際は、最初から体が軽かった。 ハイペースではしれて、最初の1kmは5分12秒のペースでは入れた。 ペースを落とさないように維持して、4:56、4:42、4:15、4:26、4:50と終始4分台で走り切れた。 いつもはペースが何故か落ちる2~3kmも維持できた。 が、次の1kmが4.15と速すぎた為、あと2kmペースを維持できるか微妙なくらい苦しかった。 さすがにラスト1kmは微妙な上り坂もあるためペースが落ちてしまったが、6kmを28分4秒、キロ4分40秒ペースだった。 歴代2位か3位の記録のはず。 かなり苦しかったし暑かった。

夜は自分のブログのサーバーを調整する。 せっかくsslに対応したので、どうせならhttp2に対応したい。
が、apacheは2.4.17以降じゃないと対応しておらず、自分のサーバーは2.4.6とういバージョンだった。 公式やremiから配布されているパッケージだと、これ以上のバージョンに上げることができない。 手段としてはパッケージでのインストールを止めて、ソースコドからコンパイルする方法がある。
が、できることならコンパイルしたくない……

そうなると別の手段を探す必要がある。 apacheを止めて、nginxに乗り換える方法。 nginx使ったことが無いが、試しにやってみようか。 公式に記載されているリポジトリを登録して、yumコマンドでnginxを入れることができた。 バージョンは1.10.1。 初めて触るnginxに苦労しながらバーチャルホストやsslの設定を行っていく。
sslの設定は
listen 443 ssl default_server
と、SSLのファイルを指定するだけで可能だった。
http2対応するのは
listen 443 ssl http2 default_server
にするだけなので非常に簡単だった。
他にはSubversionのサーバーをapacheで立てているのを、nginxに移行しなくてはならない。 やり方がわからなかったので、SVNのドメインの場合だけnginx→apacheのリバースプロキシを立てて対応した。
一部apacheが残っているけど、公開されている部分に関しては全て、nginxへ乗り換えが完了した。
ブラウザでhttpヘッダーでHTTP/2.0というのも確認できた。

が、なぜかFirefox以外のブラウザではhttp1.1のままで、2.0にならない。 なぜだかわからずかなりハマった。
結論は、opensslでALPNとNPNというのがあり、自分のサーバーにインストールしているバージョンのopensslだとNPNしか対応していなかった。 FirefoxはNPNに対応しているが、Chromeは今年の5月31日にNPNを切り捨てた、という記事が出てきた。 となると、opensslのバージョンアップをしなくてはいけないことになる……
これもyumで入れているのだが、バージョンアップの方法が無い……
ソースコードからコンパイルするしか無いのか…… ソースコードをダウンロードしてコンパイルしてできたバイナリを、/usr/bin/opensslに上書きしてみて、
openssl version
というコマンドではコンパイルした最新バージョンが返ってきたが、nginx再起動してもサーバー再起動しても、nginxを入れなおしてもChromeは変わらずだった。
opensslは元の状態に戻した。 残る手段はnginxをコンパイルするしかなさそうだ……

apacheをコンパイルするのが嫌で、nginxを試してみたのに、nginxをコンパイルしたら、そもそも最初からapacheをコンパイルしていればよかった、となりそうだ。 が、仕方ない。 nginxをコンパイルしようか。
1.11.2というバージョンをダウンロードしてきてコンパイルする。 コンパイルの際にopensslのソースコードのディレクトリを指定するだけで、自動的に関連付けがされるらしい。 nginxコンパイルするときに、内部でopensslもコンパイルしているのだろうか?
コンパイルされたnginxをsystemctlに登録したりして、ようやくコンパイルしたnginxが動いた。
そして、Chromeでもhttp2が確認できた。 ここまでかかった時間は5~6時間くらい。 長い戦いだった……
これで快適なhttp2ライフが送れるのと、nginxに乗り換えることができた。