2015年12月16日水曜日

lua-nginx-module でサンプルの lua スクリプトを試してみた

概要

前回 Nginx + lua-nginx-module のインストール方法を紹介しました
今回は簡単なサンプルの挙動を確認してみます

環境

  • 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 スクリプト作成

  • touch /opt/nginx/lua/sample.lua
  • vim /opt/nginx/lua/sample.lua
ngx.status = ngx.HTTP_UNAUTHORIZED
ngx.header.content_type = "application/json"
ngx.say('{"code": "E401001", "error": "Authentication error by header incorrect."}')
ngx.exit(ngx.HTTP_OK)

今回は、認証エラーを返却する lua スクリプトを作成しました
ステータスを設定 (ngx.status) して、Content-type を設定 (ngx.header.content_type) してレスポンスボディを設定 (ngx.say) して、スクリプトを終了しています
最後の ngx.HTTP_OK は 200 以上のステータスを設定すれば OK です
200 以上のステータスを設定した場合はリクエスト全体のレスポンスを返却し、200 未満の場合はそのスクリプトが実行されているフェーズだけが終了され、次の処理に進みます

Lua スクリプトを呼び出す

  • vim /opt/nginx/conf/nginx.conf
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    access_by_lua_file "/opt/nginx/lua/sample.lua";
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass   http://www.kakakikikeke.blogspot.jp/;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

nginx.conf はデフォルトのものからコメントアウトを削除した設定を使用しています
http ブロック内で先ほど作成した Lua スクリプトを access_by_lua_file を使ってコールします
これで各リクエストが来た時に必ず Lua スクリプトが呼ばれることになります

動作確認

今回のサンプルは Lua スクリプトを有効にしている場合は必ず認証エラー用の JSON が返ってくることになります

まず Lua スクリプトを有効にした状態で Nginx を起動しましょう
その状態でリクエストしてみると

> GET / HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: localhost
> Accept: */*
> 
< HTTP/1.1 401 Unauthorized
< Server: nginx/1.9.3
< Date: Mon, 14 Dec 2015 02:16:19 GMT
< Content-Type: application/json
< Transfer-Encoding: chunked
< Connection: keep-alive
< 
{"code": "E401001", "error": "Authentication error by header incorrect."}

こんな感じで先ほど設定した Json が返却されます

では、次に nginx.conf で呼び出した Lua スクリプトをコメントアウトして Nginx を再起動してください
すると次は認証エラーにはならず HTML が返ってくることが確認できると思います

最後に

簡単なサンプルを試してみました
リクエストのヘッダ情報やボディ情報を取得することができるので簡単な認証フィルタを作成したいのであれば、Nginx だけでできるようになると思います
ただ、認証情報が MySQL や Redis 等のデータベースにある場合がほとんどだと思うので、その場合は DB にアクセスできる Lua ドライバを使う必要があります

この辺のドライバの使い方も今後試したいなと思っています

0 件のコメント:

コメントを投稿