Minha solução de raiz de documentos também usa Lua, mas usa um script bash em vez de um banco de dados. Em suma, ele inverte as partes do domínio e as usa como uma estrutura de diretórios. Dentro dessa estrutura, os diretórios prefixados com _ podem ser usados para diferenciar raízes de documentos de subdomínios.
por exemplo.
domain.com - > com / domain / _public
sub.dominio.com - > com / domain / sub / _public
server_name _ ~^(?<www>www\.)?(?<domain>[a-zA-Z0-9-\.]+)$;
set_by_lua $docRoot "
local f = assert(io.popen('/path/to/conversion/script.sh '..ngx.var.domain, 'r'))
local s = assert(f:read('*a'))
f:close()
return s
";
root /var/www/$docRoot/_public;
Meu script de conversão é:
echo $1 | tr "." "\n" | tac | tr "\n" "/" | rev | cut -b 2- | rev | tr -d "\n"
O recorte remove uma barra adicional enquanto o tr final é necessário porque ter uma nova linha na raiz nginx trunca o / _public
Eu rodei dezenas de domínios como este sem problemas. Pode ser mais lento que um gerador de configuração baseado em modelo para cada domínio, mas eu prefiro ter um único arquivo para solucionar problemas.