libr3: Bibliothèque de dispatching de chemin haute performance basée sur libr3 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-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
Pour utiliser cette bibliothèque Lua avec NGINX, assurez-vous que nginx-module-lua est installé.
Ce document décrit lua-resty-libr3 v1.2 publié le 30 septembre 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)
-- n'oubliez pas !!!
r3:compile()
-- dispatch
local ok = r3:dispatch("/foo/a/b", ngx.req.get_method())
if not ok then
ngx.exit(404)
end
}
}
Méthodes
new
syntax: r3, err = r3router:new()
Crée un objet r3. En cas d'échec, retourne nil et une chaîne décrivant l'erreur.
syntax: r3, err = r3router:new(routes)
Les routes sont un tableau, comme { {...}, {...}, {...} }, chaque élément du tableau est une route, qui est une table de hachage.
Les attributs de chaque élément peuvent contenir les éléments suivants :
* path: uri de la requête client.
* handler: fonction de rappel Lua.
* host: optionnel, hôte de la requête client, prend en charge non seulement les noms de domaine normaux, mais aussi les noms génériques, à la fois foo.com et *.foo.com sont valides.
* remote_addr: optionnel, adresse distante du client comme 192.168.1.100, et nous pouvons utiliser le format CIDR, par exemple 192.168.1.0/24.
* methods: optionnel, c'est un tableau, nous pouvons mettre un ou plusieurs noms de méthode ensemble. Voici les noms de méthode valides : "GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS".
Exemple :
-- 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 de la requête client.callback: fonction de rappel Lua.
opts est un argument optionnel, c'est une table Lua.
* method: c'est un tableau, nous pouvons mettre un ou plusieurs noms de méthode ensemble.
* host: optionnel, hôte de la requête client, prend en charge non seulement les noms de domaine normaux, mais aussi les noms génériques, à la fois foo.com et *.foo.com sont valides.
* remote_addr: optionnel, adresse distante du client comme 192.168.1.100, et nous pouvons utiliser le format CIDR, par exemple 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
Au fait, nous pouvons ajouter un routeur en spécifiant un nom de méthode en minuscules.
Liste des noms de méthode valides : 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()
Il compile nos chemins de route en un arbre préfixe (trie). Vous devez compiler après avoir ajouté toutes les routes, sinon cela peut échouer à faire correspondre.
dispatch
syntax: ok = r3:dispatch(path, method)
path: uri de la requête client.method: nom de la méthode de la requête client.
syntax: ok = r3:dispatch(path, opts)
path: uri de la requête client.opts: une table Luamethod: optionnel, nom de la méthode de la requête client.host: optionnel, hôte de la requête client, prend en charge non seulement les noms de domaine normaux, mais aussi les noms génériques, à la foisfoo.comet*.foo.comsont valides.remote_addr: optionnel, adresse distante du client comme192.168.1.100, et nous pouvons utiliser le format CIDR, par exemple192.168.1.0/24.
Dispatch le chemin au contrôleur par method, path et 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)
Fondamentalement le même que dispatch, prend en charge le passage d'un objet table pour stocker les paramètres d'analyse, ce qui facilite la réutilisation de la table Lua.
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
### Compiler et installer
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-libr3.