先日、h2oの勉強がてら独自モジュールとして、h2o_mrubyというモジュールの開発をはじめてみました。所謂mod_mrubyやngx_mrubyのように、Webサーバの内部処理をmrubyでコントロールするためのモジュールです。そうこうしていると、h2oの作者の id:kazuhooku さんが、以下のようにツイートされていました。
h2o組み込みの言語を選ぶなら、個人的にはmruby>>luaだし、ビルドまわりがきれいにまとまるならmergeしちゃいたい
— Kazuho Oku (@kazuho) 2015, 6月 23
おお、これは本家へ取り込んで頂ける可能性もあるな!!??と思い、急遽実装を本家用に書き直して、数日前にPRを出しました。
そして、幾つかの修正やテストの実装を経て、今日の朝方ついにh2o本家に無事マージされました。やったね!
その結果、当然ながらHTTP/1.xでもHTTP/2でもmrubyが動くようになりました。
experimental support for #mruby is coming to H2O #http2 server thanks to @matsumotory https://t.co/y6g9XjNDNv
— Kazuho Oku (@kazuho) 2015, 6月 29
ということで今後は、
- H2Oクラスの実装やh2oのAPIを操作するメソッドの実装
- ヘッダやステータスコード等、レスポンスに関係する値の制御
- mod_mrubyやngx_mrubyのようにリクエスト処理中の幾つかのフェーズでフック
- 別のハンドラへのApacheやnginx的なDECLINEDによる遷移
辺りを実装していこうと思います。基本的なクラスやメソッドの設計はmod_mrubyやngx_mrubyに合わせるつもりですが、h2oはそれら以上にoptimizedなWebサーバですので、その辺りで適宜最適な実装を心がけていこうかと思っています。
とはいえ、基本的な拡張はmrbgemで拡張できるようにし、最低限のコア実装をしていく方針は変わらないと思いますので、同じような意見をお持ちの方は是非h2o_mruby改善のためのPRを出すと良いのではないでしょうか!
また、mrubyを色々触っている人もh2oへのPRがしやすくなったと思います。それぞれのコードを実装していくことで、いずれはh2oを触っていた人がmrubyを、mrubyを触っていた人がh2oをより理解して実装できるようになるでしょう。
こうやって日本人によって作られたソフトウェアが互いに連携し、多数のエンジニアを巻き込んでより素晴らしいソフトウェアへと進化していく未来を想像すると、わくわくが止まりませんね。
そういう方向に進むための、ある種のきっかけとなるPRにはなった気がします。是非皆さんも開発に参加してみては如何でしょうか。
今回のh2o_mrubyマージのPRは、テストを含め、新機能を追加するために必要な実装を概ね満たせているような気がするので、そういう意味でも今後のh2oへの新機能実装提案の仕方がひと通り分かったという点で参考になるのではないでしょうか。
h2o_mrubyの動かし方
現状のh2o_mrubyはデフォルトOFFで実装されているため、ビルドについては、linuxの場合 .travis.yml
を参考にするか、Macでサクッと試すには以下のようにビルドします。
brew install mruby cmake -DWITH_MRUBY=ON . make h2o ./h2o -c examples/h2o_mruby/h2o.conf
これで、 curl
や nghttp
からアクセスして hello from h2o_mruby
のようにレスポンスが帰ってきたら成功です。是非色々 examples/h2o_mruby/hello.rb
を変えて試してみてください。 現状では、Rubyの実行結果をレスポンスとして返すだけですが、今後機能を充実させていく予定です。
とはいえ、急な提案に対して柔軟に対応して頂き、沢山の協力的なコメントを頂いた id:kazuhooku さん、本当にありがとうございました!