TKC Works

ギジュツ的なメモ、読書感想文など

NginxとLuaとRedisと

NginxはRailsで作ったサービスを公開する時にプロキシとして使うとか、そんな感じでしか使ったことがなかったけど、LuaとRedis組み合わせると何かいろいろ出来そうということでお試し中。この組み合わせならきっと爆速。 http://d.hatena.ne.jp/hiboma/20120205/1328448746

環境構築


事前にビルドに必要なパッケージをインストール(CentOSの場合)
$ yum install gcc make pcre-devel openssl-devel

次にlua関連を入れる

LuaJIT

$ wget http://luajit.org/download/LuaJIT-2.0.3.tar.gz
$ tar xzf LuaJIT-2.0.3.tar.gz
$ cd luajit-2.0.3
$ make && make install

Lua CJSON(jsonを扱いたい場合のみ)

$ wget http://www.kyne.com.au/~mark/software/download/lua-cjson-2.1.0.tar.gz
$ tar xzf lua-cjson-2.1.0.tar.gz
$ cd cjson-2.1.0
$ make install LUA_INCLUDE_DIR=/usr/local/include/luajit-2.0

※LuaJITで動かしている場合はオプションでディレクトリを指定しないとこける

lua-redis-parser(redis2-nginx-moduleとセットで使う)

$ wget https://github.com/agentzh/lua-redis-parser/archive/v0.10.tar.gz
$ tar xzf v0.10.tar.gz
$ cd v0.10
$ make install LUA_INCLUDE_DIR=/usr/local/include/luajit-2.0
$ make install

次にNginxを入れる 下記の追加モジュールを入れるのでパッケージ管理ではなくnginxをソースからビルドする
https://github.com/chaoslawful/lua-nginx-module
https://github.com/agentzh/redis2-nginx-module
https://github.com/simpl/ngx_devel_kit/

予め各モジュールをダウンロードして展開しておく

$wget https://github.com/chaoslawful/lua-nginx-module/archive/v0.9.7.tar.gz
$ tar xzf v0.9.7.tar.gz

$wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.19.tar.gz
$ tar xzf v0.2.19.tar.gz

$wget https://github.com/agentzh/redis2-nginx-module/archive/v0.10.tar.gz
$ tar xzf v0.10.tar.gz

Nginxをダウンロードしてビルド

$ wget http://nginx.org/download/nginx-1.5.13.tar.gz
$ tar xzf nginx-1.5.13.tar.gz
$ cd nginx-1.5.13
$ export LUAJIT_INC=/usr/local/include/luajit-2.0
$ export LUAJIT_LIB=/usr/local/lib
$ ./configure \
    --add-module=/path/to/lua-nginx-module \
    --add-module=/path/to/ngx_devel_kit \
    --add-module=/path/to/redis2-nginx-module
$ make -j2
$ make install

※ソースからなので起動スクリプトは自前で作成する必要がある
※起動時にlibluajit-5.1.so.2が無いと怒られた時はシンボリックリンクを作成する ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2

参考URL http://jsoizo.hatenablog.com/entry/2013/08/25/214920
http://d.hatena.ne.jp/toritori0318/20131112/1384278264

とまあここまで書いてきたけど、OpenRestyというのが全部入りっぽいので楽そう。

使い方


公式ドキュメントを見れば分かる通り、lua-nginx-moduleには使えるディレクティブが大量にある。
よく使いそうなのはこのあたりだろうか。
(ngx.*はcontent_by_luaやcontent_by_lua_file内でしか使えないので注意。)

  • content_by_lua_file
    • luaファイルを分けたほうがconfが長くならなくてよい。
  • init_by_lua
    • ライブラリのrequireとかはここで。serverより前に書く。
  • lua_package_path
    • 自作ライブラリはパス指定しないと見つけてくれないかも。
    • lua流の書き方で"/usr/local/nginx/lib/?.lua;;"こんな風に書く。
  • ngx.location.capture
    • 内部で別locationの結果を取ってこれる。処理を分けれて便利。
  • ngx.say
  • ngx.exit
  • ngx.req.get_uri_args
    • リクエストパラメータが取得出来る。uri decodeもやってくれている。

まあそんな感じで。