Trusterd: HTTP/2 Web Server scripting with mruby v0.0.1 リリースしました

Trusterd: HTTP/2 Web Server scripting with mrubyバージョン0.0.1をリリースしました。

Trusterdはmrubyで設定を書けたり、振る舞いをプログラムブルに制御できるHTTP/2用のWebサーバです。まだまだ低機能ですが、ベースの機能が大体できたのでv0.0.1としてリリースしました。

現状の機能としては、

  • 設定をmrubyでスクリプティングできる
  • Listenアドレス・ポートの指定
  • ドキュメントルートの指定
  • serverヘッダの指定
  • デバッグオプション
  • Rubyメソッドでリクエスト・レスポンス情報を操作
  • TLSオプションの有無
    • 有りの場合はkeyとcrtファイルの指定が必要
  • Rubyブロックのコールバックオプション
    • 有りの場合リクエスト前と後でRubyブロックのコールバックが可能
  • Connection レコード記録の有無

です。

例えば、コールバックオプションを有りにすると現在は二箇所でコールバック可能で、リクエスト処理前のmap_to_storageというタイミングでURIとファイルに紐付けを変更するブロックを指定したり、

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

s.set_map_to_strage_cb {

  # location setting
  if s.request.uri == "/index.html"
    s.request.filename = "#{root_dir}/htdocs/hoge"
  end

}

[/program]

リクエスト処理後のロギングフェーズで、何かログをとったりすることができます。

[program lang=’ruby’ ]

f = File.open "#{root_dir}/logs/access.log", "a"

s.set_logging_cb {

  f.write "#{s.conn.client_ip} #{Time.now} - #{s.r.uri} - #{s.r.filename}¥n"

}

[/program]

全体のmrubyで書くconfは以下のようになります。

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

SERVER_NAME = "Trusterd"
SERVER_VERSION = "0.0.1"
SERVER_DESCRIPTION = "#{SERVER_NAME}/#{SERVER_VERSION}"

root_dir = "/usr/local/trusterd"

s = HTTP2::Server.new({

  #
  # required config
  #

  :port           => 8080,
  :document_root  => "#{root_dir}/htdocs",
  :server_name    => SERVER_DESCRIPTION,

  # required when tls option is true.
  # tls option is true by default.
  #:key            => "#{root_dir}/ssl/server.key",
  #:crt            => "#{root_dir}/ssl/server.crt",

  # listen ip address
  # default value is 0.0.0.0
  # :server_host  => "127.0.0.1",

  #
  # optional config
  #

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

  # tls default: true
  :tls => false,

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

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

  # connection_record defualt: true
  # :connection_record => false,

})

#
# 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. 
#
# }

#
# f = File.open "#{root_dir}/logs/access.log", "a"
#
# s.set_logging_cb {
# 
#   p "callback block after send response"
#   f.write "#{s.conn.client_ip} #{Time.now} - #{s.r.uri} - #{s.r.filename}¥n"
#
# }

s.run

[/program]

性能も、いつも取っているような単純なhello worldベンチでは僕のCPUコア2・メモリ8GB環境で23万reqest/secぐらいでます。詳しくはこちらを見てみて下さい。

是非、導入方法を見ながら色々遊んでみてください。また、面白いアイデアや機能追加等、随時pull-requestをお待ちしております。