Zum Inhalt

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-Tabelle
    • method: optional, Methodenname der Clientanfrage.
    • 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.

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
sudo make install ```

GitHub

Sie finden möglicherweise zusätzliche Konfigurationstipps und Dokumentationen für dieses Modul im GitHub-Repository für nginx-module-libr3.