このブログを立ち上げる際にいろんなブラウザで動作確認を行っていたら、NginxでHTTP/2を有効にしているにもかかわらずGoogle ChromeのみHTTP/1.1で通信されている(FirefoxやSafari等ではOK)という問題にぶち当たったので調べたところ、OpenSSLのバージョンを上げれば良いことが分かったので書き留めておきます。

なぜ?

Google ChromeだけHTTP/1.1。
Google ChromeだけHTTP/1.1。

Google Chromeに「HTTP/2 and SPDY indicator」拡張機能を入れているとHTTP/2対応サイトにアクセスした場合に青い稲妻アイコンがピカりますが、自分のサイトにアクセスしたときに光らなかったのでこの仕様に気づきました。入れてて良かった⚡︎

問題の原因は、Google Chromeが今年の5月頃にSPDYおよびNPN-TLS拡張のサポートを終了していたという点にありました。(参考: https://hyper-text.org/archives/2016/02/chrome_goodbye_spdy_on_may_15th.shtml

これによりGoogle Chrome 51以降ではSPDYやNPNを用いている場合はHTTP/1へフォールバックする仕様となり、HTTP/2で通信したい場合はALPN-TLS拡張を用いる必要があるとのことみたいです。(Wikipedia – ALPN

解決方法

ALPNをサポートしているのはOpenSSL 1.0.2以降なので、これより古いバージョン、たとえば1.0.1系を使用している場合は1.0.2系にアップデートすることでChromeでもHTTP/2が利用できるようになります。(参考: https://www.nginx.com/blog/supporting-http2-google-chrome-users/

Nginxを「–with-openssl」引数付きでコンパイルしていた場合は、OpenSSL 1.0.2以降で再コンパイルする必要があります。「nginx -V」コマンドでOpenSSLバージョンを確認することができます。

openSUSEの場合はTumbleweedの公式リポジトリがOpenSSL 1.0.2でした。非公式のhomeリポジトリだとOpenSSL 1.0.2でコンパイルされたNginxが配信されているものもありますが、利用には注意が必要です。Debian、CentOSあたりは自分でビルドしないとダメかな?