2015年12月15日火曜日

lua-resty-mongol を使って Nginx から MongoDB を操作してみた

概要

Nginx 上で Lua スクリプトを動作させる環境を構築しました
http://kakakikikeke.blogspot.jp/2015/12/nginx-with-lua-nginx-module.html

今回は更に拡張して Lua スクリプトから MongoDB を操作できるようにしてみたいと思います

環境

  • CentOS 6.7 64bit Final
  • LuaJIT 2.0.4
  • ngx devel kit 0.2.19
  • lua-nginx-module 0.9.19
  • nginx 1.9.3
  • lua-resty-mongol 682ad317f0d3451308a2a953fef80fbad1de872d

lua-resty-mongol のインストール

/usr/local/openresty/lualib/resty/mongol/ に必要な Lua スクリプトがインストールされました

lua-resty-string のインストール

/usr/local/lib/lua/resty/ に必要な Lua スクリプトがインストールされました

nginx.conf の修正

MongoDB に接続するためのサンプルの Lua スクリプトを実行するように修正します

access_by_lua_file "/opt/nginx/lua/connect_db.lua";

nginx.conf でインストールした各種ライブラリを読み込むこともできますが、今回は Lua スクリプト側でライブラリの読み込みを行います

Lua スクリプトの作成

  • cd /opt/nginx/lua
  • vim connect_db.lua
local p = "/usr/local/openresty/lualib/"
local p2 = "/usr/local/lib/lua/"
local m_package_path = package.path
package.path = string.format("%s?.lua;%s?/init.lua;%s?.lua;%s?/init.lua;%s", p, p, p2, p2, m_package_path)

local function test_connect()
   local mongol = require "resty.mongol"
   local conn = mongol:new()
   conn:set_timeout(1000)
   local ok, err = conn:connect("127.0.0.1", 27017)
   if not ok then
      raise_error(ngx.HTTP_INTERNAL_SERVER_ERROR, '{"code": "E500001", "error": "Auth System error."}')
   end
   local db = conn:new_db_handle("test")
   local col = db:get_col("test_col")
   local r = col:find_one({key=value})
   ngx.log(ngx.ERR, r["key"])
end

local function main()
   test_connect()
end

main()

簡単にポイントを紹介します

まず、スクリプト冒頭でライブラリのパスを指定します
今回は別々のパスにインストールされたので、2 つのパスを読み込むように設定します
もし、一箇所にインストールした場合は 1 つのパスだけ設定すれば OK です
Lua スクリプトのインストールパスが違う場合は変更してください

connect する場合の引数は IP アドレス + ポート番号になります
ホスト名でも指定できるのですが、Nginx が名前解決できない場合があるので IP で指定すると確実です

あとはサンプル通り DB 接続、Collection 接続、データ取得の流れになります

その他のメソッドは細かい仕様については公式 の README.md を見るといいと思います
あとはソースもそこまで難しくないのでソースを見ても理解できると思います

最後に

これで Nginx だけで MongoDB にアクセスできるようになりました

まだガッツリと触っていないのと複雑な処理まで実装していないので、何とも言えませんが完成したら負荷テストなどでどれくらい処理性能があるかと DB への負荷が掛かるかは確認したほうがいいかもしれません

0 件のコメント:

コメントを投稿