nginxにngx_mrubyをインストールする

More than 3 years have passed since last update.

この記事は mod_mruby ngx_mruby Advent Calendar 2014 11 日目の記事です。

@takeswimです。福岡のゲーム会社でネットワークに関する諸々の開発をしています。

@matsumotoryさんがnginxへのngx_mrubyインストールについて投稿リクエストされておりまして、実は時を同じくして久しぶりにnginx+ngx_mrubyのインストール作業をしていまして、一連の作業を元にまとめてみました。

今回はnginx1.7.8(投稿当時最新版)に対しngx_mrubyを組み込む手順について解説したいと思います。

環境はGoogle Cloud Platformから払い出しました。


  • OSはCentOS6.6

  • http接続許可

  • それ以外はデフォルト

で用意しています。

最初にオチを書いておきますと、私がこの投稿を書きながら知ったbuild.shを使用したインストールがすごく楽でお薦めです。この手法は投稿の終盤に説明しています。

またnginxへのモジュールの組み込みが「nginxにngx_mrubyを組み込む」というより「ngx_mrubyつきnginxを作る」と言った方が作業内容としては近く、タイトルとやっていることにズレがあることご容赦ください。


準備編


nginxにモジュールを組み込むには?

nginxにモジュールを追加する場合はnginxをmakeしなおす必要があります。

nginx側configureの--add-moduleオプションを使い、以下のように追加設定します。

$ ./configure --add-module=[モジュールの存在するpath]


nginxにngx_mrubyを組み込むには?

ですので、nginxにngx_mrubyを組み込むには


  • nginx側configureの--add-moduleでngx_mrubyの設定を加えnginxをmakeする

ということになります。

ngx_mrubyの組み込み方法は他にも


  • ngx_mruby側のmakeでngx_mrubyつきnginxを作る

  • ngx_mruby側のbuild.shでngx_mrubyつきnginxを作る

という手法があり、今回はそれぞれ試してみようと思います。


開発環境の準備

最初の環境が本当にまっさらでしたので、まずはgit,gccから…

$ sudo yum install git gcc -y


nginxをmakeする

nginxマスターには釈迦に説法で申し訳ありませんが念のため…

code:sh

$ cd ~
$ wget http://nginx.org/download/nginx-1.7.8.tar.gz
$ tar zxvf ./nginx-1.7.8.tar.gz
$ cd nginx-1.7.8
$ ./configure --prefix=/usr/local/nginx/
$ make
$ sudo make install

make途中でPCREとzlibが必要になり、適宜yumでインストールしています。

$ sudo yum install pcre-devel zlib-devel -y

インストールまで完了したら、一応起動して確認しておきましょう。

$ sudo /usr/local/nginx/sbin/nginx

ブラウザ等で

http://localhost/

でnginxインストール直後のデフォルト画面が出てくるか確認します。


ngx_mruby組み込み編


ngx_mrubyをmakeする

ngx_mrubyを準備します。

$ cd ~

$ git clone git://github.com/matsumoto-r/ngx_mruby.git
$ cd ngx_mruby/
$ git submodule init
$ git submodule update

ngx_mrubyにはsubmoduleとしてmrubyが関連付けされていますので、submoduleに関する対応が必要です。

そのうえでconfigure & makeします。

$ ./configure --with-ngx-src-root=/home/takeswim/nginx-1.7.8

--with-ngx-src-root設定でnginxのソースパスを設定します。これが無いとエラーになります。

$ make build_mruby

$ make generate_gems_config

ngx_mrubyのmakeにはrakeが必要です。

古いrake(少なくともyumでインストールできるruby1.8.7)だと失敗するようで、結局最新版のrubyをソースインストールしました。

$ cd ~

$ wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.5.tar.gz
$ tar zxvf ruby-2.1.5.tar.gz
$ cd ruby-2.1.5
$ ./configure & make & sudo make install

またmake途中で以下のインストールをしました。


  • bison

    mrubyのビルドツールに必要。

    $ sudo yum install bison -y


  • openssl

    mruby-digestに必要。

    $ sudo yum install openssl-devel -y


  • redis


  • hiredis

    mruby-redisに必要。今回の環境ではredis・hiredisともソースインストールしました。


$ cd ~

$ wget http://download.redis.io/releases/redis-2.8.18.tar.gz
$ tar zxvf redis-2.8.18.tar.gz
$ cd redis-2.8.18
$ make & sudo make install
$ cd ~
$ git clone https://github.com/redis/hiredis.git
$ cd hiredis
$ make & sudo make install

ちなみに当環境ではhiredisの共有ライブラリが認識されませんでした。

$ /etc/ld.so.conf.d/hiredis.confでライブラリpath(/usr/local/lib/)を追加して$ sudo ldconfig実行します。

こういった感じで適宜ライブラリをインストールしていき、ngx_mrubyのmakeが完了します。


add-moduleでngx_mrubyの設定を加えnginxをmakeする

ngx_mrubyの準備が済んだところで、nginxにngx_mrubyを組み込みます。

既に先ほどの手順でnginxはmake済ですし、nginxを運用している人ならnginxのソースは既に手元にあるかと思います。

nginxのソースパスに移動し、configureの--add-moduleオプションでngx_mruby組み込み設定します。

もちろんnginxの他のオプション設定も可能です。

$ cd ~/nginx-1.7.8

$ make clean
$ ./configure --add-module=/home/takeswim/ngx_mruby --add-module=/home/takeswim/ngx_mruby/dependence/ngx_devel_kit --prefix=/usr/local/nginx/
$ make

これでngx_mrubyが組み込まれたnginxが出来ました。

$ sudo make installでインストールします。

念のためnginx.confに設定を入れてngx_mrubyが動くのか試します。

serverディレクティブに以下のようにlocation /helloの設定を追加。


nginx.conf

:

:
location / {
root html;
index index.html index.htm;
}

location /hello {
mruby_content_handler_code '
Server = Nginx
Server.echo "WORLD"
';
}
:
:


手動起動して、ブラウザで

http://localhost/hello

へアクセス。WORLDが返ってきました。良かった!


ngx_mruby側のmakeでngx_mrubyつきnginxを作る

先ほどはnginx側でmakeをしていましたが、ngx_mruby側だけで完結することもできます。

既存のnginxがない状態からの場合、この手法は便利です。

git cloneでngx_mrubyを取得後submodule updateまでは同じ手順です。

configure時、--with-ngx-config-optでnginx側のconfigureオプションを設定、makeします。

$ ./configure --with-ngx-src-root=/home/takeswim/nginx-1.7.8 --with-ngx-config-opt="--prefix=/usr/local/nginx/"

$ make

これでngx_mrubyのmake内でnginxのmakeも実行され、ngx_mruby組み込み済みのnginxが完成します。

$ sudo make installでnginxをインストールします。


ngx_mruby側のbuild.shでngx_mrubyつきnginxを作る

去年の12月にあったようで丸一年見過ごしてました…

前述のmrubyに関するsubmodule updateどころか、nginxのソースが無かったらダウンロードもしてくれます。

先程nginxが無いときは便利…と書いていましたが、こちらの方がもっと簡単でした。

git cloneでngx_mrubyを取得後、



$ NGINX_CONFIG_OPT_ENV='--prefix=/usr/local/nginx' NGINX_SRC_ENV='/home/takeswim/nginx-1.7.8' sh build.sh

環境変数NGINX_CONFIG_OPT_ENVでnginx側に渡すオプション、NGINX_SRC_ENVでnginxのソースpathを設定します。

これでngx_mruby組み込み済みのnginxが完成します。

$ sudo make installでnginxをインストールします。


まとめ

nginxにngx_mrubyを組み込む大枠の流れは…


  • ngx_mrubyをgit cloneで取得後submodule取得し環境を整えつつmake

  • nginxでconfigure --add_module=[ngx_mrubyパス]のちmake

これについて3つの手法を説明しました。


  1. 上記通りの手順を取る

  2. ngx_mruby側のmakeのみで作成する

  3. build.shを使い作成する

個人的にはnginxインストールついでのngx_mruby組み込みという状況が多く、2をよく使っていたのですが、同じ理由であれば3でも問題ないと思いますし、既存のnginxを使い続ける必要があるのであれば1も選択としてあると思います。状況に応じて柔軟に!


(番外編)前作ったnginxのconfigオプションなんて覚えてないよ!

既存のnginxのmakeし直しとなると、旧nginxのconfigオプションも引き継がないと…だけど普通覚えてないですよね。

そんな貴方にnginx -Vオプション(Vは大文字)があります。

$ /usr/local/nginx/sbin/nginx -V

nginx version: nginx/1.7.8
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)
configure arguments: --add-module=/home/takeswim/ngx_mruby/ --add-module=/home/takeswim/ngx_mruby/dependence/ngx_devel_kit

configure argumentが指定したnginxをmakeした時のconfigureオプションになります。

この辺りをコピペして利用するとよいかと思います!


明日はainoyaさんの「mod_mrubyを使ってJWTベースの認証プロキシを作る」です!