概要
前回 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 を起動しましょう
その状態でリクエストしてみると
- curl -v http://localhost/
> 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 件のコメント:
コメントを投稿