yohoushi というグラフツールがある。 小ネタ: kurado + h2o 0.9.1 でHTTP2有効にしたときのバッドノウハウ にインスパイアされて、yohoushi でも h2o 使いたい!と思って試してみた。
HTTP2 の特徴
HTTP2 には以下のような特徴がある
- バイナリでの通信
- リクエストとレスポンスの多重化によるレイテンシの削減
- ヘッダの圧縮によるプロトコルオーバーヘッドの最小化
- リクエスト優先度設定
- サーバープッシュ
今回は多重化によるレイテンシの削減効果を狙っている。 大量の画像ファイルを配信するので、yohoushi サイドでブロッキング処理をしている間に、グラフ画像は仮想ストリームで並列的に転送しておいてもらえると助かるわけだ。
やってみる
h2o.conf は以下のようにした。
max-connections: 1024
num-threads: 4
listen:
port: 443
ssl:
certificate-file: examples/h2o/server.crt
key-file: examples/h2o/server.key
hosts:
"*":
access-log: /dev/stdout
paths:
/:
proxy.reverse.url: http://127.0.0.1:4804/
HTTP2 的には https 必須ではなくなったらしいが、chrome は(まだ) https 必須のようなので、SSL を有効にしている。
で、chrome を --enable-spdy4
付きで起動するか、chrome://flagsからEnable SPDY/4を有効にしてアクセス。してみたけど、動かない!!!!
HTTP2 クライアント
デベロッパーツールの console に net::ERR_SPDY_COMPRESSION_ERROR
と出てるが意味がわからない。
Chrome だと埒が明かなかったので、HTTP2 の通信をみれるクライアントツールがないか聞いてみた(つぶやいてみた)ところ、以下のツールがあるようだった。
- httpie-http2
- curl を --with-nghttp2 オプション付きでビルド
- nghttp2に同梱されている nghttp クライアント
- wireshark (クライアントではないが)
nghttp2 をインストールして nghttp を使った。
$ nghttp --verbose https://localhost
0.067] recv (stream_id=1, noind=0) :status: 200
[ 0.067] recv (stream_id=1, noind=0) server: h2o/1.0.1-alpha1
[ 0.067] recv (stream_id=1, noind=0) date: Tue, 24 Feb 2015 04:47:57 GMT
[ 0.067] recv (stream_id=1, noind=0) status: 200 OK
[ 0.067] recv (stream_id=1, noind=0) x-frame-options: SAMEORIGIN
[ 0.067] recv (stream_id=1, noind=0) x-xss-protection: 1; mode=block
[ 0.067] recv (stream_id=1, noind=0) x-content-type-options: nosniff
[ 0.067] recv (stream_id=1, noind=0) content-type: text/html; charset=utf-8
[ 0.067] recv (stream_id=1, noind=0) etag: W/"4f1320dd91df8855ee7ca822875bd087"
[ 0.067] recv (stream_id=1, noind=0) cache-control: max-age=0, private, must-revalidate
[ 0.068] send GOAWAY frame <length=8, flags=0x00, stream_id=0>
(last_stream_id=0, error_code=COMPRESSION_ERROR(0x09), opaque_data(0)=[])
Some requests were not processed. total=1, processed=0
body が返らずにすぐ GOAWAY になってしまっているようだった。
バッドノウハウ
色々と試してみた結果、レスポンスから Set-Cookie ヘッダを削除するとなんと動く。rails new したばかりの素の rails でも試してみたが、同様だった。rails の場合、ActionDispatch::Cookies Rackミドルウェアを削除すれば付与自体を防げる。
--- a/config/application.rb
+++ b/config/application.rb
@@ -34,5 +34,7 @@ module Yohoushi
+
+ config.middleware.delete ActionDispatch::Cookies
って、これじゃ困るので Issue にしたためました! もし「こうするべきだよ!」という方法をご存じの方がいたら是非教えてください!
(追記) 2015/02/25 早速 kazuho 先生に直して頂きました!=> pull request
ということで、1.0.2 から h2o on rails が問題なく動くはずです!
(追記) http2 RFC 発行記念 祝賀飲み会 LT 大会 でどれぐらい高速化したのか具体的な数字付きで話して来たので資料をおいておきます => HTTP/2 でリバプロするだけでグラフツールを 高速化できた話