ngx_mruby vs lua-nginx-module 対決してみた

論文や発表が少し落ち着いたので、研究の実装を再開しています。

そこでふと思ったのですが、そういえばngx_mrubylua-nginx-moduleのパフォーマンス比較していないなぁと思いました。でも、今検証環境が色々あって揃っていないので微妙だなぁと思いつつも、やっぱり気になると試さずにはいられないたちなので、簡単なhello worldのベンチマーク比較をしてみました。

続きを読む

ngx_mrubyの紹介 ならびに nginx+mruby+Redisによる動的なリバースプロキシの実装案

ようやくngx_mrubyでもmod_mrubyのように動的なリバースプロキシ設定ができるようになりました。タイトルは完全に@hibomaさんによる「lua-nginx-module の紹介 ならびに Nginx+Lua+Redisによる動的なリバースプロキシの実装案」をパク … inspireしたものになっています。

今回の工夫点としては、

  1. ngxin内部の変数をうまく使う
  2. redisとのセッションはnginx起動時に一度だけ行なって、そのオブジェクトを使いまわす
  3. proxy_passを使って汎用的な設定にする

の3点です。

続きを読む

mrb_stateを共有しているRubyコード間でuserdataを読み書きできるmruby-userdata作った

mrubyにおいて、mrb_stateを共有しているRubyコード間で、userdataを自由に読み書きできるmruby-userdataというmrbgemを作りました。

これは、mrubyの状態遷移情報を格納しているmrb_stateを共有している限り、あるタイミングでコードAが呼ばれて、次に別のタイミングでコードBが呼ばれた場合、コードAでuserdataオブジェクトを保存しておけば、コードBからそのオブジェクトを取り出せる仕組みです。

グローバル変数を使えばコード間でやり取りができますが、なんとなくグローバル変数を使うのは実装上バグを生みそうなので、C側にuserdataを保存しておくハッシュテーブルオブジェクトを作っておいて、そこにRuby側から保存したい時に保存しておき、取り出したい時に取り出すためのRubyメソッドによるインターフェイスを実装しました。

比較的安全にuserdataを保存しておけると思います。

続きを読む

マルチプラットフォームでmrubyを使ってHTTP通信する方法

mrubyも少しずつ知られてきていて、WindowsやLinux、MacOSX等マルチプラットフォームで色々遊んでいる人が多いことでしょう。そうなってくると、しばらく弄ってみた後はやっぱりマルチプラットフォームで同じようにHTTPで通信してみたいと思いませんか?

例えば、

  • mrubyでHTTPのGETとかPOSTとかしてみたり
  • mrubyを組み込んだデバイスからTwitterに呟いてみたり
  • 各種デバイスからZabbixをつついてみたり
  • エアコンを監視してるRaspberry PiからGrowthForecastにデータを送ってグラフ化してみたり
  • 組み込みデバイスや低レイヤーなソフトウェアからfluentdにデータを送って解析してみたり

ということで、今回はそういうことをするためにはmruby側でどういう準備をして、どう実装すればいいかの導入部分を説明したいと思います。

続きを読む