libr3: Hochleistungsbibliothek für die Pfadverarbeitung basierend auf libr3 für nginx-module-lua
Installation
Wenn Sie das RPM-Repository-Abonnement noch nicht 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-libr3
CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-libr3
Um diese Lua-Bibliothek mit NGINX zu verwenden, stellen Sie sicher, dass nginx-module-lua installiert ist.
Dieses Dokument beschreibt lua-resty-libr3 v1.2, veröffentlicht am 30. September 2019.
location / {
content_by_lua_block {
-- r3 router
local r3 = require("resty.r3").new();
local encode_json = require("cjson.safe").encode
function foo(params) -- foo handler
ngx.say("foo: ", encode_json(params))
end
-- routing
r3:get("/foo/{id}/{name}", foo)
-- don't forget!!!
r3:compile()
-- dispatch
local ok = r3:dispatch("/foo/a/b", ngx.req.get_method())
if not ok then
ngx.exit(404)
end
}
}
Methoden
new
syntax: r3, err = r3router:new()
Erstellt ein r3-Objekt. Im Falle von Fehlern gibt es nil und eine Zeichenfolge zurück, die den Fehler beschreibt.
syntax: r3, err = r3router:new(routes)
Die Routen sind eine Array-Tabelle, wie { {...}, {...}, {...} }. Jedes Element im Array ist eine Route, die eine Hash-Tabelle ist.
Die Attribute jedes Elements können Folgendes enthalten:
* path: URI der Clientanfrage.
* handler: Lua-Callback-Funktion.
* host: optional, Host der Clientanfrage, unterstützt nicht nur normale Domainnamen, sondern auch Wildcard-Namen, sowohl foo.com als auch *.foo.com sind gültig.
* remote_addr: optional, Remote-Adresse des Clients wie 192.168.1.100, und wir können das CIDR-Format verwenden, z. B. 192.168.1.0/24.
* methods: optional, es ist eine Array-Tabelle, in der wir einen oder mehrere Methodennamen zusammenfassen können. Hier sind die gültigen Methodennamen: "GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS".
Beispiel:
-- foo handler
function foo(params)
ngx.say("foo: ", require("cjson").encode(params))
end
local r3route = require "resty.r3"
local r3 = r3route.new({
{
path = [[/foo/{:\w+}/{:\w+}]],
method = {"GET"},
handler = foo
},
{
path = [[/bar/{:\w+}/{:\w+}]],
host = "*.bar.com",
handler = foo
},
{
path = [[/alice/{:\w+}/{:\w+}]],
remote_addr = "192.168.1.0/24",
handler = foo
},
{
path = [[/bob/{:\w+}/{:\w+}]],
method = {"GET"},
host = "*.bob.com",
remote_addr = "192.168.1.0/24",
handler = foo
},
})
insert_route
syntax: r3, err = r3:insert_route(path, callback, opts)
path: URI der Clientanfrage.callback: Lua-Callback-Funktion.
opts ist ein optionales Argument, es ist eine Lua-Tabelle.
* method: Es ist eine Array-Tabelle, in der wir einen oder mehrere Methodennamen zusammenfassen können.
* host: optional, Host der Clientanfrage, unterstützt nicht nur normale Domainnamen, sondern auch Wildcard-Namen, sowohl foo.com als auch *.foo.com sind gültig.
* remote_addr: optional, Remote-Adresse des Clients wie 192.168.1.100, und wir können das CIDR-Format verwenden, z. B. 192.168.1.0/24.
-- route
local function foo(params)
ngx.say("foo")
end
local r3route = require "resty.r3"
local r3 = r3route.new()
r3:insert_route("/a", foo)
r3:insert_route("/b", foo, {method = {"GET"}})
add router
Übrigens können wir einen Router hinzufügen, indem wir einen Methodennamen in Kleinbuchstaben angeben.
Gültige Methodennamenliste: get, post, put, delete, patch, head, options.
-- route
local function foo(params)
ngx.say("foo")
end
r3:get("/a", foo)
r3:post("/b", foo)
r3:put("/c", foo)
r3:delete("/d", foo)
compile
syntax: r3:compile()
Es kompiliert unsere Routenpfade in einen Präfixbaum (Trie). Sie müssen nach dem Hinzufügen aller Routen kompilieren, andernfalls kann es sein, dass keine Übereinstimmung gefunden wird.
dispatch
syntax: ok = r3:dispatch(path, method)
path: URI der Clientanfrage.method: Methodenname der Clientanfrage.
syntax: ok = r3:dispatch(path, opts)
path: URI der Clientanfrage.opts: eine Lua-Tabellemethod: optional, Methodenname der Clientanfrage.host: optional, Host der Clientanfrage, unterstützt nicht nur normale Domainnamen, sondern auch Wildcard-Namen, sowohlfoo.comals auch*.foo.comsind gültig.remote_addr: optional, Remote-Adresse des Clients wie192.168.1.100, und wir können das CIDR-Format verwenden, z. B.192.168.1.0/24.
Dispatcht den Pfad an den Controller nach method, path und host.
local ok = r3:dispatch(ngx.var.uri, ngx.req.get_method())
dispatch2
syntax: ok = r3:dispatch2(param_tab, path, method)
syntax: ok = r3:dispatch2(param_tab, path, opts)
Grundsätzlich dasselbe wie dispatch, unterstützt das Übergeben eines table-Objekts zum Speichern von Parsing-Parametern, was die Wiederverwendung von Lua-Tabellen erleichtert.
Ubuntu
sudo apt-get install check libpcre3 libpcre3-dev build-essential libtool \ automake autoconf pkg-config
CentOS 7
sodu yum install gcc gcc-c++ git make automake autoconf pcre pcre-devel \
libtool pkgconfig
### Kompilieren und installieren
GitHub
Sie finden möglicherweise zusätzliche Konfigurationstipps und Dokumentationen für dieses Modul im GitHub-Repository für nginx-module-libr3.