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とファイルに紐付けを変更するブロックを指定したり、
s.set_map_to_strage_cb {
# location setting
if s.request.uri == "/index.html"
s.request.filename = "#{root_dir}/htdocs/hoge"
end
}
# location setting
if s.request.uri == "/index.html"
s.request.filename = "#{root_dir}/htdocs/hoge"
end
}
リクエスト処理後のロギングフェーズで、何かログをとったりすることができます。
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"
}
s.set_logging_cb {
f.write "#{s.conn.client_ip} #{Time.now} - #{s.r.uri} - #{s.r.filename}¥n"
}
全体のmrubyで書くconfは以下のようになります。
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
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
性能も、いつも取っているような単純なhello worldベンチでは僕のCPUコア2・メモリ8GB環境で23万reqest/secぐらいでます。詳しくはこちらを見てみて下さい。
是非、導入方法を見ながら色々遊んでみてください。また、面白いアイデアや機能追加等、随時pull-requestをお待ちしております。
0 Comments.