HEYBlog about Technology

京都の学生エンジニアのエンジニアブログ

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のどこがええの?

alt text

こんな感じで、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上)

ローカルだとそんなことなかった。

そんなことより、このレポジトリの人、京大の博士課程っぽいから一回会ってみたい。

今回はここまで。