mrubyで設定を書けるTrusterd HTTP/2 Webサーバを作ってみた

この3連休を使って、mrubyで設定を書けるTrusterdという名前のHTTP/2 Webサーバを作ってみました。まだ機能は限定的ですが、とりあえず動くので公開します。

以前からWebサーバの設定をこなれたプログラミング言語で書きたいと思っていて、ちょうどそれにmrubyのサイズや言語仕様がしっくりきたため実装にとりかかりました。

実装にはnghttp2というCのHTTP/2ライブラリとそれとlibevent2を組み合わせて作ったmruby-http2を使っています。

Trusterdの設定

現状は機能が少ないですが、このように書けます。

[program lang=’ruby’ escaped=’true’]

root_dir = "/usr/local/trusterd"

s = HTTP2::Server.new({
  :port           => 8080,
  #:key            => "#{root_dir}/ssl/server.key",
  #:crt            => "#{root_dir}/ssl/server.crt",
  :document_root  => "#{root_dir}/htdocs",
  :server_name    => "mruby-http2 server",

  #
  # optional config
  #

  # debug default: false
  # :debug  =>  true,

  # tls default: true
  :tls => false,

  # damone default: false
  # :daemon => true,

  # callback default: false
  # :callback => true,
})

#
# when :callback option is true,
#
# s.set_map_to_strage_cb {
#
#   p "callback bloack at set_map_to_strage_cb"
#   p s.request.uri
#   p s.request.filename
#
#   # location setting
#   if s.request.uri == "/index.html"
#     s.request.filename = "#{root_dir}/htdocs/hoge"
#   end
#   p s.request.filename
#
#   # you can use regexp if you link regexp mrbgem.
#   # Or, you can use KVS like mruby-redis or mruby-
#   # vedis and so on. 
#
# }

# s.set_logging_cb {
#
#   p "callback block after send response"
#   p "response file: #{s.request.filename}"
#
# }

s.run

[/program]

インストールの仕方はtrusterdのページに書いてある通りです。今はなんちゃってのbuild.shを書いてますが、この辺りは整備する予定です。build.shを叩くとtrusterdバイナリが出来上がって、上記の設定をそのバイナリに渡して実行します。大体以下のようなイメージです。

[program lang=’bash’ escaped=’true’]

mkdir -p /usr/local/trusterd/{bin,htdocs,ssl,conf}
cp bin/trusterd /usr/local/trusterd/bin/.
cp bin/trusterd.conf.rb /usr/local/trusterd/conf/.
echo hello trusterd world. > /usr/local/trusterd/htdocs/index.html
/usr/local/trusterd/bin/trusterd /usr/local/trusterd/conf/trusterd.conf.rb

[/program]

現状では、HTTP/2でTLSを使う使わないを簡単に設定できたり、callbackオプションを使う事で、set_map_to_strage_cbメソッドにブロックを渡せば、その中でリクエストのあったファイル名を見たり上書きしたりするような、所謂Locationの設定が書けます。ここに、regexpや外部データストアのmrbgemを組み合わせる事で、もう少し柔軟な設定が書けると思います。この辺りはこれから機能を追加していこうと思います。

また、ベンチマークをしても軽量なコンテンツにおいてはそれなり性能が出ていて、ベンチマークの履歴ページ前回のエントリ等を参考にして下さい。

まとめ

HTTP/2が実用化されるのはだいぶ先だと思いますが、そうなってから自分の作りたいWebサーバを実装していては遅いので、今とりかかっています。mrubyやHTTP/2に興味がある方は是非気軽に、trusterdの実装の元になっているmruby-http2に対して機能提案やbug修正のpull-requestを投げて頂けると幸いです。