Pular para conteúdo

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étodo handle, 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* e header_filter_by_lua*, onde a API de cosocket do ngx_lua não está disponível.
  • A instância do objeto resty.memcached nã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 de resty.memcached. Você deve sempre iniciar objetos resty.memcached em variáveis locais de função ou na tabela ngx.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.