Nginx verwendet ctx, um Datenfreigabe- und Kontextänderungsfunktionen zu realisieren

Nginx verwendet ctx, um Datenfreigabe- und Kontextänderungsfunktionen zu realisieren

Umgebung: init_worker_by_lua, set_by_lua, rewrite_by_lua, access_by_lua, content_by_lua, header_filter_by_lua, body_filter_by_lua, log_by_lua, ngx.timer., balancer_by_lua

Diese Lua-Tabelle kann zum Speichern anforderungsbasierter Lua-Umgebungsdaten verwendet werden und ihre Lebensdauer entspricht der der aktuellen Anforderung (ähnlich wie bei Nginx-Variablen).

Siehe das folgende Beispiel:

 Standort /Test {
  umschreiben_durch_lua_block {
   ngx.ctx.foo = 76
  }
  Zugriff über Lua-Block {
   ngx.ctx.foo = ngx.ctx.foo + 3
  }
  Inhalt von Lua-Block {
   ngx.say(ngx.ctx.foo)
  }
 }

Zugriff auf GET /test-Ausgabe

79

Das heißt, der Eintrag ngx.ctx.foo bleibt während der Umschreib-, Zugriffs- und Inhaltsverarbeitungsphasen einer Anforderung konsistent.

Jede Anfrage, einschließlich Unteranfragen, hat ihre eigene Kopie der ngx.ctx-Tabelle. Zum Beispiel:

 Standort /sub {
  Inhalt von Lua-Block {
   ngx.say("sub vor: ", ngx.ctx.blah)
   ngx.ctx.blah = 32
   ngx.say("Unterbeitrag: ", ngx.ctx.blah)
  }
 }

 Standort /main {
  Inhalt von Lua-Block {
   ngx.ctx.blah = 73
   ngx.say("Hauptvorspann: ", ngx.ctx.blah)
   lokale Auflösung = ngx.location.capture("/sub")
   ngx.print(res.body)
   ngx.say("Hauptbeitrag: ", ngx.ctx.blah)
  }
 }

Zugriff auf GET /main-Ausgabe

Hauptvorwahl: 73
Sub-Pre: Null
Unterbeitrag: 32
Hauptbeitrag: 73

Hier wirkt sich das Ändern des Eintrags ngx.ctx.blah in der untergeordneten Anforderung nicht auf den gleichnamigen Eintrag in der übergeordneten Anforderung aus, da jeweils eine andere Version von ngx.ctx.blah verwaltet wird.

Durch die interne Umleitung werden die ngx.ctx-Daten in der ursprünglichen Anfrage (sofern vorhanden) zerstört und die neue Anfrage verfügt über eine leere ngx.ctx-Tabelle. Zum Beispiel,

 Standort /neu {
  Inhalt von Lua-Block {
   ngx.say(ngx.ctx.foo)
  }
 }

 Standort /orig {
  Inhalt von Lua-Block {
   ngx.ctx.foo = "hallo"
   ngx.exec("/neu")
  }
 }

Der Zugriff auf GET /orig gibt aus

Null

anstelle des ursprünglichen „Hallo“-Wertes.

Beliebige Datenwerte, einschließlich Lua-Closures und verschachtelter Tabellen, können in diese „magische“ Tabelle eingefügt werden, die auch die Registrierung benutzerdefinierter Metamethoden ermöglicht.

Es ist auch möglich, ngx.ctx mit einer neuen Lua-Tabelle zu überschreiben, zum Beispiel:

ngx.ctx = { foo = 32, bar = 54 }

Bei Verwendung in einem init_worker_by_lua*-Kontext hat diese Tabelle die gleiche Lebensdauer wie der aktuelle Lua-Handle.

Für das Suchen in ngx.ctx-Tabellen sind relativ aufwändige Metamethodenaufrufe erforderlich, die viel langsamer sind als die direkte Weitergabe anforderungsbasierter Daten über die Funktionsargumente des Benutzers. Missbrauchen Sie diese API daher nicht zum Speichern von Benutzerfunktionsparametern, da dies erhebliche Auswirkungen auf die Leistung haben kann.

Und versuchen Sie wegen der „Magie“ der Metamethode nicht, ngx.ctx auf „lokaler“ Ebene auf Lua-Modulebene zu verwenden, beispielsweise für die Datenfreigabe auf Worker-Ebene. Das folgende Beispiel ist schlecht:

-- meinmodule.lua

lokales _M = {}

-- Die Datei ngx.ctx in der folgenden Zeile gehört zu einer einzelnen Anfrage, aber die Variable ctx befindet sich auf der Ebene des Lua-Moduls

- und gehört einem einzelnen Arbeiter.

 lokales ctx = ngx.ctx

 Funktion _M.main()
  ctx.foo = "Leiste"
 Ende

 return _M

Stattdessen sollte Folgendes verwendet werden:

 -- meinmodule.lua
 lokales _M = {}

 Funktion _M.main(ctx)
  ctx.foo = "Leiste"
 Ende

 return _M

Das heißt, der Anrufer sollte den Aufruf der CTX-Tabelle abschließen, indem er Parameter an die Funktion übergibt.

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • Beispiel einer Methode zur gemeinsamen Sitzungskonfiguration in Nginx
  • Nginx-Lastausgleich für gemeinsam genutzte Sitzungen an mehreren Standorten
  • nginx+tomcat implementiert Lastenausgleich und verwendet Redis-Sitzungsfreigabe
  • nginx + redis realisiert Sitzungsfreigabe

<<:  Anwendungsbeispiele für React Hooks

>>:  Detailliertes Tutorial zum Anpassen des Installationspfads der MySQL-Version 5.7.18 (Installation von Binärpaketen)

Artikel empfehlen

MySQL-Datenbankoperationen und Datentypen

Inhaltsverzeichnis 1. Datenbankbetrieb 1.1 Datenb...

Zusammenfassung einiger wichtiger Punkte zu mysql init_connect

Die Rolle von init_connect init_connect wird norm...

Grafisches Tutorial zur Installation von MySQL 5.7.17 (Windows)

Ich habe vor Kurzem mit dem Studium der Datenbank...

MYSQL Eine Frage zur Verwendung von Zeichenfunktionen zum Filtern von Daten

Problembeschreibung: Struktur: test hat zwei Feld...

Einführung in die Generierung von Kubernetes-Zertifikaten mit OpenSSL

Kubernetes unterstützt drei Arten der Authentifiz...

Implementierung von Docker-Datenvolumenoperationen

Erste Schritte mit Datenvolumes Wenn wir im vorhe...

Beispielcode zum Konvertieren von HTML-Tabellendaten in das JSON-Format

Die Javascript-Funktion zum Konvertieren von <t...

Beispielcode zur Implementierung einer Hohlmaskenebene mit CSS

Inhalt dieses Artikels: Seitenhohlmaskenebene, Se...

Beheben Sie den Fehler beim Löschen von MySQL-Benutzern

Als der Autor MySQL zum Hinzufügen eines Benutzer...

Beispielcode für horizontales Balkendiagramm von Echarts Bar

Inhaltsverzeichnis Horizontales Balkendiagramm Da...

So verwenden Sie Umgebungsvariablen in der Nginx-Konfigurationsdatei

Vorwort Nginx ist ein auf Leistung ausgelegter HT...

Tools zum Konvertieren statischer Websites in RSS

<br /> Dieser Artikel wurde von Rachel Golds...