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éthodehandle, 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*, etheader_filter_by_lua*où l'API cosocket ngx_lua n'est pas disponible. - L'instance de l'objet
resty.memcachedne 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 instanceresty.memcached. Vous devez toujours initier des objetsresty.memcacheddans des variables locales de fonction ou dans la tablengx.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.