読者です 読者をやめる 読者になる 読者になる

Cent OS(6.4)にNginx + lua-nginx-moduleをインストール

はてブのWeb Hookを使ったアプリケーションを作っているのだが、Postパラメータとして飛んでくるタグの値が条件にマッチする場合にのみ処理をしたく。

当然、アプリケーション側に実装することもできるが、アプリケーションの負荷軽減と高速なレスポンスのために、条件にマッチしないリクエストに対してはリバースプロキシでサクッと200を返してしまいたい。

そこで、Nginx + lua-nginx-module。

インストール方法は公式のインストール方法ここを参考に。

1. 必要なもの

  1. Nginx (2013-08-25時点での最新版は1.5.3)
  2. LuaJIT (2013-08-25時点での最新版は2.0.2)
  3. ngx_devel_kit
  4. lua-nginx-module

2. インストール

i. LuaJITのインストール

yumのリポジトリがないので、ソースからコンパイルしてインストール。デフォルトではインストール先が/usr/localになるのだが、/usr/local/luajit以下にインストールしたいので、PREFIXでインストール先を指定してビルドする。

[root@jsvm local]# wget http://luajit.org/download/LuaJIT-2.0.2.tar.gz
[root@jsvm local]# mkdir luajit
[root@jsvm local]# tar xzvf LuaJIT-2.0.2.tar.gz
[root@jsvm local]# cd LuaJIT-2.0.2
root@jsvm LuaJIT-2.0.2]# make PREFIX=/usr/local/luajit
==== Building LuaJIT 2.0.2 ====
・
(中略)
・
==== Successfully built LuaJIT 2.0.2 ====
[root@jsvm LuaJIT-2.0.2]# make install PREFIX=/usr/local/luajit
==== Installing LuaJIT 2.0.2 to /usr/local/luajit ====
・
(中略)
・
==== Successfully installed LuaJIT 2.0.2 to /usr/local/luajit ====
[root@jsvm LuaJIT-2.0.2]# cd /usr/local/bin/
[root@jsvm bin]# ln -s /usr/local/luajit/bin/luajit
[root@jsvm bin]# luajit -v
LuaJIT 2.0.2 -- Copyright (C) 2005-2013 Mike Pall. http://luajit.org/

ii. LuaJITのライブラリとヘッダファイルのパスを設定

[root@jsvm luajit]# export LUAJIT_LIB=/usr/local/luajit/lib
[root@jsvm luajit]# export LUAJIT_INC=/usr/local/luajit/include/luajit-2.0

iii.必要なモジュールをダウンロード

ngx_devel_kitがないと動かないのでngx_devel_kitと、lua-nginx-module本体をGitHubからダウンロード。

[root@jsvm ~]# cd /usr/local/src
[root@jsvm src]# git clone git://github.com/simpl/ngx_devel_kit.git
[root@jsvm src]# git clone git://github.com/chaoslawful/lua-nginx-module.git

iv. Nginxのインストール

iiiでダウンロードしてきたモジュールを--add-moduleしてビルド。

[root@jsvm local]# wget http://nginx.org/download/nginx-1.5.3.tar.gz
[root@jsvm local]# tar xzvf nginx-1.5.3.tar.gz
[root@jsvm local]# cd nginx-1.5.3
[root@jsvm nginx-1.5.3]# ./configure --prefix=/usr/local/nginx \
> --add-module=/usr/local/src/ngx_devel_kit \
> --add-module=/usr/local/src/lua-nginx-module
[root@jsvm nginx-1.5.3]# make
[root@jsvm nginx-1.5.3]# make install

v. とりあえず起動テスト

したら以下の様なエラーが出たので

[root@jsvm nginx]# ./sbin/nginx
./sbin/nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory

ライブラリのパスを明示されていなかったようなので、Issuesを参考にexportして対処。

[root@jsvm nginx]# export LD_LIBRARY_PATH=/usr/local/luajit/lib:$LD_LIBRARY_PATH
[root@jsvm nginx]# ./sbin/nginx
[root@jsvm nginx]#

また、configure時に下記オプションをつけることで防げる模様。

--with-ld-opt="-Wl,-rpath,$LUAJIT_LIB"

僕の環境では下記の起動スクリプトでexportしている。

とりあえず起動できた。

f:id:jsoizo:20130826001730p:plain

vi. lua-nginx-moduleの動作確認

configを以下のように変更し、

http {
(中略)
    server {
        (中略)
        location /lua_test {
            default_type 'text/plain';
            content_by_lua "ngx.say('Hello, World!')";
        }
    }
}

再起動。

[root@jsvm nginx]# ./sbin/nginx -s quit
[root@jsvm nginx]# ./sbin/nginx

おお。うごいた。

f:id:jsoizo:20130826001740p:plain

3. 起動スクリプトの作成

ソースからコンパイルした場合、/etc/init.d/以下に起動スクリプトが作成されないので、ここを参考に起動スクリプトを作成。先述のLD_LIBRARY_PATHのexportはstartの中で実行している。

start() {
    export LD_LIBRARY_PATH=/usr/local/luajit/lib:$LD_LIBRARY_PATH
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

これをサービスに登録

[root@jsvm init.d]# chkconfig --add nginx
[root@jsvm init.d]# chkconfig nginx on
[root@jsvm init.d]# chkconfig --list nginx
nginx           0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@jsvm init.d]# service nginx stop
Stopping nginx:                                            [  OK  ]
[root@jsvm init.d]# service nginx start
Starting nginx:                                            [  OK  ]
[root@jsvm init.d]#

無事に終了。

次はアプリケーションの実装と、lua-nginx-moduleの有無の差をベンチマークをとってみようかと思う。

おしまい。