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

Beispiel für den schnellen Aufbau eines Redis-Clusters mit Docker

Was ist Redis Cluster? Redis Cluster ist eine von...

Verwenden des radialen Farbverlaufs in CSS zum Erzielen eines Karteneffekts

Vor einigen Tagen erhielt eine Kollegin ein Punkt...

Drei Vererbungsmethoden in JavaScript

erben 1. Was ist Vererbung? Vererbung: Zunächst e...

Der Unterschied und die Verwendung von LocalStorage und SessionStorage in Vue

Inhaltsverzeichnis Was ist LocalStorage Was ist S...

Vue realisiert die Funktion zum Hochladen von Fotos auf den PC

In diesem Artikelbeispiel wird der spezifische Co...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 8.0.18 (Linux)

Dieser Artikel zeichnet das grafische Tutorial zu...

Designperspektive Technologie ist ein wichtiges Kapital der Designfähigkeit

Ein Designsoldat fragte: „Kann ich nur reines Des...

Vue+echarts realisiert Fortschrittsbalken-Histogramm

In diesem Artikel wird der spezifische Code von v...

Einführung in Docker-Container

1. Übersicht 1.1 Grundlegende Konzepte: Docker is...