HTTP/2対応のWebサーバソフトウェアであるh2oを試してみました。

OS Xでインストール&セットアップ

インストール

launchctlで操作できるようにplistのリンクを作成しておきます。

リンクを貼ったplistはlaunchctlでstart/stopできるように以下のように修正します

launchdに読み込ませます

あとは以下のコマンドでstart/stopできます

HTTP/2を試したい場合はTLS接続が前提となっています。/usr/local/opt/h2o/share/doc/h2o/examplesにサンプルのconfigや秘密鍵、証明書が入っているので、それらを使ってHTTP/2をすぐに試せます。(もちろんオレオレ証明書ですが)

Ubuntuでインストール

ソースからインストール(mruby対応版)

サンプルの設定で回す場合は以下のようにして実行すればOK。

ChromeでHTTP/2を体感する

以下のHTMLにアクセスしてHTTP/2を体感してみます。

HTTP/1.1バージョン(http://{Host Name}:8080)

h2o_http1_timeline

HTTP/2バージョン(https://{Host Name}:8081)

h2o_http2_timeline

HTTP/1の場合は同一ドメインに対して同時接続数6の制限が効いていますが、HTTP/2の場合は1つのTCP接続を使うことになるので、同時にリクエストが行われます。

mruby拡張

404 Not Foundエラーをmrubyから返す場合

IPアドレス制限

標準で用意されているディレクティブによらず柔軟な処理が可能なので便利

HTTP/2のサーバPushを体感する

H2Oのmruby拡張を使ってサーバPushを体感してみます。

設定ファイルのpaths以下は以下のように記載します。mruby.handlerだと設定ファイルに直接Rubyコードを書けますが、色々と不便なので、mruby.handler-fileで外部ファイルを読み込ませています。

handler.rbはこんな感じで

リクエストしてみるとこんな感じでドキュメント読み込みが完了する前には既に画像取得が完了しているため、トータルのリクエスト時間は短くなります(注・以下のリクエストはsleepを意図的に入れているため、上記例とのタイムライン上の比較は出来ません)

h2o_http2_serverpush

サンプルなのでlinkが固定値(hoge*.rb)になっていますが、実際には各ドキュメントに対して静的なファイルをマッピングして、handler側でマッピングされた静的ファイルのリストをlinkヘッダで返すような形になります。実運用的にはクローラのようなHTMLパーサでマッピングを自動生成するような感じになるんですかね。

PHPと連携してみる

php-fpmを使ってphpを利用できるようにします。php5-fpmがUnixドメインソケットを利用している場合は以下のように記述します。

file.dirは絶対パスにしないとFastCGI側で以下のエラーになります。

userが未指定の場合はh2oのプログラムを起動したユーザが実行ユーザになります。実行ユーザがphp5-fpmのソケットに対して適切なパーミッションが無い場合、以下のエラーになります。

今回試した環境では以下のようなパーミッションになっていたので、www-dataユーザを実行ユーザにする必要がありました。

参考URL