Aller au contenu

router: Routeur http Lua pour nginx-module-lua

Installation

Si vous n'avez pas encore configuré l'abonnement au dépôt RPM, inscrivez-vous. Ensuite, vous pouvez procéder avec les étapes suivantes.

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

Pour utiliser cette bibliothèque Lua avec NGINX, assurez-vous que nginx-module-lua est installé.

Ce document décrit lua-resty-router v0.1.0 publié le 26 juin 2017.


Cette bibliothèque Lua est un routeur http pour le module ngx_lua de nginx :

http://wiki.nginx.org/HttpLuaModule

Cette bibliothèque Lua tire parti de l'API cosocket de ngx_lua, qui garantit un comportement 100 % non-bloquant.

Notez qu'au moins ngx_lua 0.5.0rc29 ou OpenResty 1.0.15.7 est requis.

Synopsis

    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éthodes

L'argument key fourni dans les méthodes suivantes sera automatiquement échappé selon les règles d'échappement URI avant d'être envoyé au serveur memcached.

new

syntax: r, err = router:new()

Crée un objet routeur, ne retourne jamais d'erreur.

route

Utilisation de GET, POST, HEAD, PUT, PATCH, DELETE, ANY et 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()

Paramètres dans le chemin

    local R = require("resty.router")
    local router = R:new()

    -- attraper tout lorsque la route correspond
    router:get("/*", function(params) -- /* ou * est ok
        ngx.say("attraper tout") 
        ngx.exit(200)
    end)

    -- Ce gestionnaire correspondra à /user/john mais ne correspondra ni à /user/ ni à /user
    router:get("/user/:name", function(params)
        local name = params["name"]
        ngx.print("Bonjour", name)
        ngx.exit(200)
    end)

    -- Cependant, celui-ci correspondra à /user/john/ et aussi à /user/john/send
    -- Si aucun autre routeur ne correspond à /user/john, il redirigera vers /user/john/
    router.get("/user/:name/*", function(params)
        local name = params("name")
        ngx.print("Bonjour", name)
        ngx.exit(200)
    end)

    -- Celui-ci correspondra à /user/jhon/send.html, correspond également à toute uri commençant par /user/jhon/ et se terminant par .html
    router:get("/user/jhon/*.html", function(params)
        ngx.print("Bonjour")
        ngx.exit(200)
    end)

    router:run()

gestionnaire

Le type de paramètre gestionnaire doit être une fonction ou une chaîne, lorsque le type est :

  • fonction, le gestionnaire sera appelé lorsque l'uri correspond
  • chaîne, le routeur nécessitera a.b, lorsque le type de retour est table, recherche la méthode handle, si le type de retour est une fonction, la fonction de retour sera appelée.

Conseils

  • La règle '*' peut être utilisée à la fin de la route
  • lancer le code http 500 lorsque des conflits de route se produisent

run

La méthode run trouvera la route et appellera le gestionnaire. lorsque aucun gestionnaire n'a été trouvé et que notfound_handler est défini, elle appellera le gestionnaire.

    local R = require("resty.router")
    local router = R:new()
    router:run() -- ou router:run(notfound_handler)

Limitations

  • Cette bibliothèque ne peut pas être utilisée dans des contextes de code comme set_by_lua*, log_by_lua*, et header_filter_by_lua* où l'API cosocket ngx_lua n'est pas disponible.
  • L'instance de l'objet resty.memcached ne peut pas être stockée dans une variable Lua au niveau du module Lua, car elle sera alors partagée par toutes les requêtes concurrentes traitées par le même processus de travail nginx (voir http://wiki.nginx.org/HttpLuaModule#Data_Sharing_within_an_Nginx_Worker) et entraînera de mauvaises conditions de concurrence lorsque des requêtes concurrentes essaient d'utiliser la même instance resty.memcached. Vous devez toujours initier des objets resty.memcached dans des variables locales de fonction ou dans la table ngx.ctx. Ces endroits ont tous leurs propres copies de données pour chaque requête.

GitHub

Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-router.