lua-nginx-module tips - luaで動的にNginxのドキュメントルートを変更

Nginxのlua-nginx-moduleでドキュメントルート(root)は変更できるのかと、同僚 id:lamanotramaさんに質問もらってたので検証です。

ちょっと前に書いた lua-nginx-module の紹介 ならびに Nginx+Lua+Redisによる動的なリバースプロキシの実装案 と比べて小粒なエントリです。こちらは proxy_passを動的に変更する例でした。

結果から言うとできる

ホスト名を見て 適当に ドキュメントルート $root を振り分けるサンプル設定です

worker_processes  1;
error_log  /dev/stderr debug;

events {
    worker_connections  256;
}

http {

    server {
        listen       8080;
        server_name  localhost;

        location / {
            set $root "";
            rewrite_by_lua '
            local host = ngx.req.get_headers()["Host"]
            if host and host == "sushi.example.com" then
              ngx.var.root = "/home/naoya/sushi/ogotte"
            else
              ngx.var.root = "/home/hiboma"
            end
            ';
            root $root;
        }
   }
}

rewrite機能でも同様のことができるので、これだけでは特に役にたたないコードです。ngx.location.path + proxy_pass を組み合わせ何らかのストレージと連携する、もしくは実務に即した振り分けロジックを組み込むことで現実的な運用の場面で役立ちそうな印象です。

標準のログ設定ではどこの root に割り振りしたかアクセスログで判断できないのでヘッダを追加するなど 一工夫必要そうです。