概要
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 のインストール
- cd ~/work/
- git clone https://github.com/bigplum/lua-resty-mongol.git
- cd lua-resty-mongol/
- make install
/usr/local/openresty/lualib/resty/mongol/
に必要な Lua スクリプトがインストールされました
lua-resty-string のインストール
- cd ~/work/
- git clone https://github.com/openresty/lua-resty-string.git
- cd lua-resty-string
- make install
/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 件のコメント:
コメントを投稿