nginx + mrubyで画像返すやつ書いてみた
(おい!またこいつnginxの話してるぞ!!)
わりと環境構築から詰まるところ多かった
matsumoto-r/ngx_mruby · GitHub
基本的にここ参照だお!
git clone git://github.com/matsumoto-r/ngx_mruby.git cd ngx_mruby git submodule init git submodule update sh build.sh sudo make install
github上のREADMEに
./configure --prefix=/usr/local/nginx --add-module=${NGX_MRUBY_SRC} --add-module=${NGX_MRUBY_SRC}/dependence/ngx_devel_kit --add-module=${SOME_OTHER_MODULE}
みたいな感じでいける! って書いてあって、nginxのコンパイルみたいなのいつもconfigure使ってたし、configureでやろうと思ったら、
--add-moduleとかないお!
とか言われて、--helpとかで見たらそんなオプションなかったw
素直に、ビルドするためのスクリプト用意してくれてるので、それ使ったらいいと思います。
rakeコマンド使えるようにしていない人は
gem install rake
しとけば、いけるはず。
あとhiredis周りでエラー吐くかも。
Macなら
brew instlal hiredis
CentOS上なら
git clone https://github.com/redis/hiredis.git cd hiredis make && sudo make install
でいけたはず。
一回詰まったんはhiredisのバージョンがおかしいって言われ続けた気がする。
最初、hiredisの設定するのに、
sudo yum install hiredis-devel hiredis
でやったら、バージョン1個古くて、動かんかった。(ここクッソ詰まった)
0.11?をビルドするようにすればいいと思います。
0.11にバージョンできて、ngx_mrubyの見てるバージョンが違っているのも詰まった。
そんときは
先にhiredisの構築してから、ngx_mrubyのビルドスクリプト回せばおk
nginx + mrubyのどこがええの?
こんな感じで、nginx.confにrubyスクリプト埋め込めたり、rubyスクリプトを外部から呼んだりして、nginxの変数を変更したりとか。
とりあえず、静的ファイルである画像を返すのをnginx+ mruby使えばこんな感じになる
location ~ /(.*\.png) { set $image_name $1; set $image_path ""; add_header Content-type image/png; mruby_access_handler /usr/local/ngx_mruby/build/nginx/html/get_image.rb; root $image_path; }
/usr/local/nginx_mruby/build/nginx/html/get_image.rb
r = Nginx::Request.new s = Nginx::Server.new image_name = r.var.image_name first_dir = r.var.image_name[0,1] second_dir = r.var.image_name[1,1] filename = "/home/koheyhey/localdata/#{first_dir}/#{second_dir}/#{image_name}" r.var.set "image_path", filename
r.var.image_name
で、nginxの変数を取得している。
nginx.conf内に
set $image_name $1;
って書いたこれをrubyスクリプト内で取得できるみたいな感じ。
nginx.conf上だと文字列分割とかその辺の処理書くの面倒(正規表現ゴリゴリに書いたらいける)
mrubyとかなら、 外部で呼び込んだrubyスクリプト内でゴリゴリnginxの変数をrubyで書けるよね!ってところが便利だね!ってことか。
r.var.set "image_path", filename
とかだと、nginx.conf内で初期化しておいた
set $image_path "";
を新たにsetする感じ。
今回は外部のrubyスクリプトファイルを呼んでるみたいな感じで書いたけど、
nginx.conf内でもrubyスクリプトゴリゴリ書くこともできる。(数行ならこれでもエエと思う)
あと、わりと詰まったところは
mruby_access_handler '/home/ec2-user/get_image.rb' cache;
このmruby_access_handlerの後ろにcacheを付けへんと動かない事案発生してた(EC2上)
ローカルだとそんなことなかった。
そんなことより、このレポジトリの人、京大の博士課程っぽいから一回会ってみたい。
今回はここまで。