re:inventing the wheel

それでも車輪は回っている

Lua-nginx-module(ngx_lua)をインストールしてみた

NGINXといえば軽量・高速なWebサーバですが、動的に設定反映できるリバプロはないかと探しているうちに サイボウズ 深谷さんのスライドを見つけ Luaモジュールの存在を知ることになりました。

いろいろ試してからエントリーしたかったのですが、まとまった検証時間が取れていないため、今回は (即出の記事もありますが)インストールしてみたと題してお茶を濁そうかと思います。
(実際にはいろいろなディレクティブが用意されているのでちゃんと調べたいのですが、、、)

とりあえず、インストールしてみよう

ngx_luaはサードパーティモジュールのため、利用するにはNGINXをソースからビルドする必要があります。 なお、オフィシャルにも書いてありますが、今回導入したv0.9.15では以下のバージョンをフォローしているようです。

  • 1.7.x (last tested: 1.7.10)
  • 1.6.x
  • 1.5.x (last tested: 1.5.12)
  • 1.4.x (last tested: 1.4.4)
  • 1.3.x (last tested: 1.3.11)
  • 1.2.x (last tested: 1.2.9)
  • 1.1.x (last tested: 1.1.5)
  • 1.0.x (last tested: 1.0.15)
  • 0.9.x (last tested: 0.9.4)
  • 0.8.x >= 0.8.54 (last tested: 0.8.54)

必要なもの

オフィシャルページには以下のように書かれています。

  1. Install LuaJIT 2.0 or 2.1 (recommended) or Lua 5.1 (Lua 5.2 is not supported yet). LuaJIT can be downloaded from the the LuaJIT project website and Lua 5.1, from the Lua project website. Some distribution package managers also distribute LuajIT and/or Lua.
  2. Download the latest version of the ngx_devel_kit (NDK) module here
  3. Download the latest version of ngx_lua here
  4. Download the latest version of NGINX here.

あれ?… latest version of NGINX??
とりあえず、今回は1.7系からの最新stableの1.8を利用。またLuaはJIT 2.0系を使用してみました。

ダウンロード

今回は、tar.gzファイルを /usr/local/src にダウンロード・展開して作業を行いました。

LuaJIT ※JIT 2.0系を使用

1
# wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz

ngx_devel_kit

1
# wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.19.tar.gz

lua-nginx-module

1
# wget https://github.com/openresty/lua-nginx-module/archive/v0.9.16.tar.gz

NGINX

1
# wget http://nginx.org/download/nginx-1.8.0.tar.gz

インストール

まずは、LuaJITをインストールします。 デフォルトでは /usr/local 以下にインストールされます。 インストール先をを変更する場合は、make PREFIX=/home/myself/lj2 とPREFIXオプションを設定します。 ここでは、デフォルトのパスにインストールしました。

1
2
3
# tar xvzf LuaJIT-2.0.4.tar.gz
# cd LuaJIT-2.0.4
# make && make install

続いて、NGINXのビルド時に必要となるライブラリをyumからインストールします。

1
# yum install pcre-devel zlib-devel openssl-devel

ここからが、lua-nginx-moduleのインストールとなります。 ngx_devel_kitとlua-nginx-moduleは展開するだけで、NGINXビルド時にadd-moduleオプションでパスを指定します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# # ngx_devel_kit-0.2.19の展開
# tar xvzf v0.2.19.tar.gz

# # lua-nginx-module-0.9.16の展開
# tar xvzf v0.9.16.tar.gz

# # nginx-1.8.0の展開、make
# tar xvzf nginx-1.8.0.tar.gz
# cd nginx-1.8.0

# # NGINXビルドのために、LuaJITの環境変数を設定
# export LUAJIT_LIB=/usr/local/lib
# export LUAJIT_INC=/usr/local/include/luajit-2.0

# # NGINXビルド&インストール
# ./configure \
  --with-ld-opt="-Wl,-rpath,/usr/local/lib" \
  --add-module=/usr/local/src/ngx_devel_kit-0.2.19 \
  --add-module=/usr/local/src/lua-nginx-module-0.9.16

# make -j2 && make install

とりあえず動作テスト

とりあえず、以上でlua-nginx-module入りのNGINXインストールは完了したので動作テストを行います。 ここではブラウザ画面に “Hello, ngx_lua World!”と表示させるだけのシンプルな設定だけ試してみました。

locationを nginx.conf に以下の設定を追加しました。

1
2
3
4
5
6
    location /hello {
        # MIME type determined by default_type:
        default_type 'text/plain';

        content_by_lua "ngx.say('Hello, ngx_lua World!')";
    }

NGINXを起動し、curlで動作確認をします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# /usr/local/nginx/sbin/nginx
# curl -v http://localhost/hello
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /hello HTTP/1.1
> User-Agent: curl/7.29.0
> Host: localhost
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.8.0
< Date: Sat, 17 Oct 2015 09:35:12 GMT
< Content-Type: text/plain
< Transfer-Encoding: chunked
< Connection: keep-alive
<
Hello, ngx_lua World!
* Connection #0 to host localhost left intact

うまく動きました!!

最後に…

今回は、ngx_luaを動かすための最低限configureでビルドしました。なので必要に応じてモジュールは 追加する必要があります。 普段はNGINXのオフィシャルレポジトリ からのパッケージ版インストールばかりでしたのでNGINXのconfigureには疎いですが、パッケージ版から nginx -V などして確認すると良いかもしれません。

また、NGINX 3rd Party Modulesを見ると色々なモジュールが提供されていますので、 機会があれば触ってみたいと思います。

以上