router: Roteador http Lua para nginx-module-lua
Instalação
Se você ainda não configurou a assinatura do repositório RPM, inscreva-se. Depois, você pode prosseguir com os seguintes passos.
CentOS/RHEL 7 ou Amazon Linux 2
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-router
CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-router
Para usar esta biblioteca Lua com o NGINX, certifique-se de que o nginx-module-lua esteja instalado.
Este documento descreve lua-resty-router v0.1.0 lançado em 26 de junho de 2017.
Esta biblioteca Lua é um roteador http para o módulo ngx_lua do nginx:
http://wiki.nginx.org/HttpLuaModule
Esta biblioteca Lua aproveita a API de cosocket do ngx_lua, que garante um comportamento 100% não bloqueante.
Observe que é necessário pelo menos ngx_lua 0.5.0rc29 ou OpenResty 1.0.15.7.
Sinopse
server {
location /test {
content_by_lua '
local Router = require "resty.router"
router = Router:new()
router:get("/a/:b/:c", function(params)
ngx.print(params["b"].."-"..parmams["c"])
end)
router:post("/b/c/*.html", function(params)
ngx.print("echo html")
end)
router:any("/c/d/", function(params)
ngx.print("hello, world")
end)
';
}
}
Métodos
O argumento key fornecido nos seguintes métodos será automaticamente escapado de acordo com as regras de escape de URI antes de ser enviado ao servidor memcached.
new
syntax: r, err = router:new()
Cria um objeto roteador, nunca retorna um erro.
route
Usando GET, POST, HEAD, PUT, PATCH, DELETE, ANY e OPTIONS
local R = require("resty.router")
local router = R:new()
router:get("/GetRoute", handler)
router:post("/PostRoute", handler)
router:head("/HeadRoute", handler)
router:put("/PutRoute", handler)
router:delete("/DeleteRoute", handler)
router:patch("/PatchRoute", handler)
router:options("/OptionsRoute", handler)
router:any("/AnyRoute", handler)
router:run()
Parâmetros no caminho
local R = require("resty.router")
local router = R:new()
-- captura tudo quando a rota é correspondida
router:get("/*", function(params) -- /* ou * está ok
ngx.say("captura tudo")
ngx.exit(200)
end)
-- Este manipulador corresponderá a /user/john, mas não corresponderá nem a /user/ nem a /user
router:get("/user/:name", function(params)
local name = params["name"]
ngx.print("Olá", name)
ngx.exit(200)
end)
-- No entanto, este corresponderá a /user/john/ e também a /user/john/send
-- Se nenhum outro roteador corresponder a /user/john, redirecionará para /user/john/
router.get("/user/:name/*", function(params)
local name = params("name")
ngx.print("Olá", name)
ngx.exit(200)
end)
-- Este corresponderá a /user/jhon/send.html, também corresponderá a qualquer uri que comece com /user/jhon/ e termine com .html
router:get("/user/jhon/*.html", function(params)
ngx.print("Olá")
ngx.exit(200)
end)
router:run()
manipulador
O tipo do parâmetro manipulador deve ser função ou string, quando o tipo é:
- função, o manipulador será chamado quando a uri for correspondida
- string, o roteador exigirá
a.b, quando o tipo de retorno for tabela, busca o métodohandle, se o tipo de retorno for função, a função retornada será chamada.
Dicas
- A regra '*' pode ser usada no final da rota
- lançar código http 500 quando houver conflitos de rota
run
O método run encontrará a rota e chamará o manipulador. Quando nenhum manipulador for encontrado e o notfound_handler estiver definido, chamará o manipulador.
local R = require("resty.router")
local router = R:new()
router:run() -- ou router:run(notfound_handler)
Limitações
- Esta biblioteca não pode ser usada em contextos de código como
set_by_lua*,log_by_lua*eheader_filter_by_lua*, onde a API de cosocket do ngx_lua não está disponível. - A instância do objeto
resty.memcachednão pode ser armazenada em uma variável Lua no nível do módulo Lua, porque então será compartilhada por todas as solicitações concorrentes tratadas pelo mesmo processo de trabalhador do nginx (veja http://wiki.nginx.org/HttpLuaModule#Data_Sharing_within_an_Nginx_Worker) e resultará em más condições de corrida quando solicitações concorrentes tentarem usar a mesma instância deresty.memcached. Você deve sempre iniciar objetosresty.memcachedem variáveis locais de função ou na tabelangx.ctx. Esses lugares têm suas próprias cópias de dados para cada solicitação.
GitHub
Você pode encontrar dicas de configuração adicionais e documentação para este módulo no repositório GitHub do nginx-module-router.