Develop with pleasure!

福岡でCloudとかBlockchainとか。

mod_mruby入れてみた。

mruyApacheのモジュールとして組み込むmod_mruby入れてみる。

インストール

まず、mrubyのインストールから。

$ git clone https://github.com/mruby/mruby.git
$ make

makeが終わるとbinフォルダ直下にバイナリが生成される。

$ mruby -v
mruby - Embeddable Ruby  Copyright (c) 2010-2012 mruby developers

続いて、mod_mrubyのインストール。

$ git clone https://github.com/matsumoto-r/mod_mruby.git

直下にMakefileがあるので自分の環境用に、apxsとapachectlのパスを書き換える。あとApache 2.4使ってるのでDEF=-D__APACHE24__のコメントアウトを外す。

...
#   the used tools
# use apache 2.2
#APXS=/usr/sbin/apxs
#APACHECTL=/etc/init.d/httpd

# use apache 2.4
APXS=/usr/local/apache2/bin/apxs
APACHECTL=/usr/local/apache2/bin/apachectl
DEF=-D__APACHE24__
...

※あと、libjson.laのパスも違ったので書き換えた。

$ make
$ make install

makeが正常に終了すると、Apacheのモジュールとして/usr/local/apache2/modules/mod_mruby.soが生成され、httpd.confにmod_mrubyのロード処理が追記される。

サンプル

/usr/local/apache2/htdocs/test.mrbという↓なファイルを作成する。

require 'Apache'

r = Apache::Request.new()
r.content_type = "text/html"
Apache.rputs("test<br>")
Apache.rputs("OK status= #{Apache::OK}<BR>")
Apache.rputs("DECLINED status= #{Apache::DECLINED}<BR>")
Apache.rputs("HTTP_OK status= #{Apache::HTTP_OK}<BR>")
Apache.rputs("HTTP_SERVICE_UNAVAILABLE status= #{Apache::HTTP_SERVICE_UNAVAILABLE}<BR>")
Apache.rputs("filename= " + r.filename + "<BR>")
Apache.rputs("uri= " + r.uri + "<BR>")
Apache.rputs("user= " + r.user + "<BR>")
Apache.rputs("the_request= " + r.the_request + "<BR>")
Apache.rputs("protocol= " + r.protocol + "<BR>")
r.filename = "/usr/local/apache2/htdocs/index.html"
r.uri = "/index.html"
r.user = "hoge"
r.the_request = "hoge"
r.protocol = "hoge"
Apache.rputs("---- request_rec changed ----<br>")
Apache.rputs("filename= " + r.filename + "<BR>")
Apache.rputs("uri= " + r.uri + "<BR>")
Apache.rputs("user= " + r.user + "<BR>")
Apache.rputs("content_type= " + r.content_type + "<BR>")
Apache.rputs("the_request= " + r.the_request + "<BR>")
Apache.rputs("protocol= " + r.protocol + "<BR>")
Apache.rputs("hostname= " + r.hostname + "<BR>")

Apache.return(Apache::OK)

続いて、httpd.confにtest.mrbを使ったフックを定義。

<IfModule mruby_module>
  mrubyTranslateNameFirst /usr/local/apache2/htdocs/test.mrb
</IfModule>

これでApacheを再起動し、http://localhost/fugeとかにアクセスすると、↓な画面が表示される。


ApacheのmoduleをRubyで書けるのは良いよね。