読者です 読者をやめる 読者になる 読者になる

人間とウェブの未来

「ウェブの歴史は人類の歴史の繰り返し」という観点から色々勉強しています。

h2o_mruby v0.0.1をリリースしてみた

研究 プログラミング Webサーバ

そういえば今から3年前に、

blog.matsumoto-r.jp

blog.matsumoto-r.jp

などなどの実装を開始しました。色々と懐かしいですね。そして時代は進み....

H2Oは言わずと知れた id:kazuhooku さんが中心となって開発されているWebサーバですが、そのモジュール実装はどうなっているのかなーと思い、調査ついでにh2o_mrubyをざっと実装してみました。

一旦は、ApacheのDSOのような形で実装する方法がパッと見思いつかなかったので、まずはH2Oをフォークしてhandlerモジュールとして実装し、一部本体も弄る形で実装してみました。

github.com

今日は家の用事で出社が昼飯時になってしまい、ちょうどそのタイミングでやってみようかな?と思っちゃったら最後、H2Oの中身が面白かったのでお昼休憩を使って実装しはじめちゃいました。

id:udzura さんにお昼誘われたのにそれを断ってまでやりたくなったので、せめて実装は完成しなくてはと思って頑張って2、3時間で実装できました。大体の時間はH2Oのお作法やAPIあたりを理解するのにほぼ9割の時間がかかったのですが、ある程度わかってしまえばとても分かりやすい、というか、設計が綺麗なのでそれなりに簡単に動くものをかけました。

nghttp2を使ったWebサーバであるTrusterdを書き始めた頃にも似た感覚を得たので、やっぱり設計って重要ですね。

workerスレッドの初期化時のフック等もちゃんと用意されていたので、mrubyインタプリタをスレッド単位で起こせるため、mrubyのマルチスレッド問題もmruby per threadにより問題なく実装できました。

ということで、もう少し弄った後に、ちゃんと独立したモジュールとしての実装の仕方(H2Oを再ビルドしなくて良いような)が分かれば、随時以下のh2o_mrubyリポジトリに移行していくつもりでいます。

github.com

現在は以下のように設定をRubyスクリプトを書いて、

  • h2o.conf
hosts:
  "127.0.0.1.xip.io:8080":
    paths:
      /:
        file.dir: examples/doc_root
        mruby.handler_path: /path/to/hello.rb
    access-log: /dev/stdout
  • /path/to/hello.rb
h = "hello"
m =  "from h2o_mruby"
h + " " + m + "\n

以下のようにRubyスクリプトを実行した結果をレスポンスとして返すぐらいの機能しかないのですが、

$ curl http://127.0.0.1:8080/
hello from h2o_mruby

まずは少しでも動くものをリリースということで!

もちろん今後はmod_mrubyやngx_mrubyで得た知見を元に、同じように性能を低下させることなく、H2Oを操作するC APIをmrubyのクラスとメソッドでwrapしてRubyで制御できるようにしていこうと思っておりますので、お楽しみに!