Zum Inhalt

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.b erfordern, wenn der Rückgabewert vom Typ Tabelle ist, wird die Methode handle gesucht, 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* und header_filter_by_lua* verwendet werden, wo die ngx_lua cosocket-API nicht verfügbar ist.
  • Die resty.memcached Objektinstanz 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, dieselbe resty.memcached Instanz zu verwenden. Sie sollten immer resty.memcached Objekte in lokalen Funktionsvariablen oder in der ngx.ctx Tabelle 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.