router: Lua http Router für nginx-module-lua
Installation
Wenn Sie noch kein RPM-Repository-Abonnement eingerichtet haben, melden Sie sich an. Dann können Sie mit den folgenden Schritten fortfahren.
CentOS/RHEL 7 oder 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
Um diese Lua-Bibliothek mit NGINX zu verwenden, stellen Sie sicher, dass nginx-module-lua installiert ist.
Dieses Dokument beschreibt lua-resty-router v0.1.0, das am 26. Juni 2017 veröffentlicht wurde.
Diese Lua-Bibliothek ist ein http Router für das ngx_lua NGINX-Modul:
http://wiki.nginx.org/HttpLuaModule
Diese Lua-Bibliothek nutzt die cosocket-API von ngx_lua, die ein 100% nicht blockierendes Verhalten gewährleistet.
Beachten Sie, dass mindestens ngx_lua 0.5.0rc29 oder OpenResty 1.0.15.7 erforderlich ist.
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)
';
}
}
Methoden
Das key-Argument, das in den folgenden Methoden bereitgestellt wird, wird automatisch gemäß den URI-Escaping-Regeln vor dem Senden an den Memcached-Server escaped.
new
syntax: r, err = router:new()
Erstellt ein Router-Objekt, gibt niemals einen Fehler zurück.
route
Verwendung von GET, POST, HEAD, PUT, PATCH, DELETE, ANY und 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()
Parameter im Pfad
local R = require("resty.router")
local router = R:new()
-- fängt alles ab, wenn eine Route übereinstimmt
router:get("/*", function(params) -- /* oder * ist ok
ngx.say("catch all")
ngx.exit(200)
end)
-- Dieser Handler wird /user/john übereinstimmen, aber weder /user/ noch /user
router:get("/user/:name", function(params)
local name = params["name"]
ngx.print("Hello", name)
ngx.exit(200)
end)
-- Dieser hier wird jedoch /user/john/ und auch /user/john/send übereinstimmen
-- Wenn keine anderen Router /user/john übereinstimmen, wird er auf /user/john/ umgeleitet
router.get("/user/:name/*", function(params)
local name = params("name")
ngx.print("Hello", name)
ngx.exit(200)
end)
-- Dieser wird /user/jhon/send.html übereinstimmen, auch jede URI, die mit /user/jhon/ beginnt und mit .html endet
router:get("/user/jhon/*.html", function(params)
ngx.print("Hello")
ngx.exit(200)
end)
router:run()
handler
Der Typ des Parameters handler sollte eine Funktion oder ein String sein, wenn der Typ ist:
- Funktion, der Handler wird aufgerufen, wenn die URI übereinstimmt
- String, der Router würde
a.berfordern, wenn der Rückgabewert vom Typ Tabelle ist, wird die Methodehandlegesucht, wenn der Rückgabewert vom Typ Funktion ist, wird die zurückgegebene Funktion aufgerufen.
Tipps
- Die '*' Regel kann am Ende der Route verwendet werden
- HTTP-Code 500 werfen, wenn Routen Konflikte haben
run
Die Methode run sucht die Route und ruft den Handler auf. Wenn kein Handler gefunden wurde und notfound_handler gesetzt ist, wird der Handler aufgerufen.
local R = require("resty.router")
local router = R:new()
router:run() -- oder router:run(notfound_handler)
Einschränkungen
- Diese Bibliothek kann nicht in Code-Kontexten wie
set_by_lua*,log_by_lua*undheader_filter_by_lua*verwendet werden, wo die ngx_lua cosocket-API nicht verfügbar ist. - Die
resty.memcachedObjektinstanz kann nicht auf Modulebene in einer Lua-Variablen gespeichert werden, da sie dann von allen gleichzeitigen Anfragen, die vom selben NGINX-Worker-Prozess bearbeitet werden, geteilt wird (siehe http://wiki.nginx.org/HttpLuaModule#Data_Sharing_within_an_Nginx_Worker) und zu schlechten Race-Conditions führen kann, wenn gleichzeitige Anfragen versuchen, dieselberesty.memcachedInstanz zu verwenden. Sie sollten immerresty.memcachedObjekte in lokalen Funktionsvariablen oder in derngx.ctxTabelle initialisieren. Diese Orte haben alle ihre eigenen Datenkopien für jede Anfrage.
GitHub
Sie finden zusätzliche Konfigurationstipps und Dokumentation für dieses Modul im GitHub-Repository für nginx-module-router.