Verwenden Sie das NJS-Modul, um JS-Skripte in die Nginx-Konfiguration einzuführen

Verwenden Sie das NJS-Modul, um JS-Skripte in die Nginx-Konfiguration einzuführen

Vorwort

Da viele Webentwickler mit der Sprache Lua nicht vertraut sind, hat nginx das Modul njs eingeführt, das js-Skripte in die nginx-Konfiguration einführen kann, um einige komplexere nginx-Konfigurationsfunktionen zu erreichen.

Im Folgenden werden die Funktionen und die Verwendung des NJS-Moduls vorgestellt.

1. NJS-Modul installieren

Erfordert eine Nginx-Version höher als 1.9.11, da die Direktive load_module erst ab dieser Version unterstützt wird

Methode 1: NJS-Module dynamisch laden

Hinweis: Verschiedene Versionen von nginx erfordern entsprechende Versionen des NJS-Moduls.

  • Legen Sie die Datei ngx_http_js_module.so in das Modulverzeichnis des Nginx-Stammverzeichnisses.
  • Importmodul in nginx.conf hinzufügen
lade_Module Module/ngx_http_js_module.so;
Lademodulmodule/ngx_stream_js_module.so;

Methode 2: Module während der Kompilierung hinzufügen

Quellcode herunterladen https://hg.nginx.org/njs/?_ga=2.99259804.301589667.1638621670-451035464.1638621670

Dieses Repository wird in Mercurial verwaltet und Sie müssen den Befehl hg verwenden, um den Quellcode herunterzuladen

hg-Klon http://hg.nginx.org/njs

Fügen Sie beim Kompilieren von nginx die folgende Konfiguration hinzu

./configure --add-module=<Pfad zu njs>/njs/nginx

2. Eigenschaften der Betriebsumgebung des NJS-Moduls

Das NJS-Modul führt kein Nodejs aus, daher kann nginx js nur wie das Lua-Modul als Middleware von nginx verwendet werden und nicht unabhängig als vollständiger Backend-Dienst genutzt werden.

Im Gegensatz zu der Node- oder Browser-Laufumgebung, mit der Front-End-Studenten vertraut sind, verwendet njs nicht die v8-Parsing-Engine. Nginx passt offiziell eine Parsing-Engine basierend auf der ECMAScript-Sprachspezifikation an. Daher unterscheiden sich auch die unterstützte Syntax und die Funktionen vom Standard.

1. Erstellen Sie für jede Anforderung eine Laufzeitumgebung und zerstören Sie diese, wenn die Anforderung endet

Die virtuelle Maschine, die gestartet wird, wenn der Knoten ausgeführt wird, befindet sich im Speicher und die Speicherbereinigung wird automatisch abgeschlossen, wenn die virtuelle Maschine ausgeführt wird.

NJS erstellt für jede Anforderung eine neue virtuelle Maschine und weist Speicher zu. Am Ende der Anforderung zerstört es die virtuelle Maschine und gibt den Speicher frei.

2. Nicht blockierende Codeausführung

njs verwendet ein ereignisgesteuertes Modell, um die NJS-Laufzeitumgebung zu planen. Wenn NJS einen blockierenden Vorgang ausführt (z. B. das Lesen von Netzwerkdaten oder das Senden einer externen Unteranforderung), unterbricht Nginx die Ausführung der aktuellen NJS-VM und plant sie neu, wenn das Ereignis abgeschlossen ist. Daher kann der NJS-Code einfach linear geschrieben werden

3. Unterstützt nur einen Teil der ECAMA-Spezifikationssyntax

NJS basiert auf der ECMAScript 5.1-Spezifikation und unterstützt einige Funktionen in ECMAScript 6

Liste der unterstützten Syntax https://nginx.org/en/docs/NJS/compatibility.html?_ga=2.91935000.301589667.1638621670-451035464.1638621670

4. Verarbeitung von Integrationsanfragen

Nginx verarbeitet Anfragen in mehreren Phasen. Nginx-Anweisungen werden normalerweise in einer bestimmten Phase ausgeführt, um die Anfrage zu verarbeiten. Nginx-Module verwenden diese Funktion, um eine Anfrage zu debuggen oder zu ändern.

Das NJS-Modul verwendet auch Anweisungen, um die JS-Codelogik in einem bestimmten Stadium auszuführen.

Drei NJS-Module unterstützen Anweisungen und entsprechende Verarbeitungsschritte

Verarbeitungsphase HTTP-Modul Stream-Modul
Zugriff – Authentifizierung und Zugriffskontrolle auth_request und js_content js_zugriff
Pre-Read – Nutzlast lesen/schreiben N / A js_preread
Filter – Lese-/Schreibantwort während Proxy js_body_filter js_header_filter js_filter
Inhalt – Antwort an den Client senden js_inhalt N / A
Protokoll / Variablen – Auswertung bei Bedarf js_set js_set

Vier einfache Anwendungsbeispiele für NJS

Das folgende Beispiel verwendet js, um ein Protokollformat zu definieren

Erstellen Sie eine logging.js-Datei im Nginx-Konfigurationsverzeichnis

// Dateispeicherort: [nginx-Stammverzeichnis]/conf/logging.js
// Dateiinhalt: Analysiere die Anfrage und drucke alle Anfrageheader aus function logAllHeaders(r) {
    var log = `${r.variables.time_iso8601} Client=${r.remoteAddress} Methode=${r.method} URI=${r.uri} Status=${r.status}`;
    r.rawHeadersIn.forEach(h => log += ` in.${h[0]}=${h[1]}`);
    r.rawHeadersOut.forEach(h => log += ` out.${h[0]}=${h[1]}`);
    Rückgabeprotokoll;
}

exportiere Standard { logAllHeaders }
# nginx-Konfigurationsdatei http {
   js_import logging.js; #js_import lädt ein js-Skript, das im Verzeichnis der nginx-Konfigurationsdatei abgelegt wird. Der js-Dateiname wird als Namespace des Moduls verwendet. Wenn Sie auf eine Funktion verweisen, können Sie diese mit [Dateiname] referenzieren. [Funktionsname] js_set $log_all_headers logging.logAllHeaders; #js_set speichert die Ausgabe der Funktion logAllHeaders in der js-Datei in der Variable $log_all_headers.
   log_format kvpairs $log_all_headers; # Ein Protokollformat anpassen kvpairs
    Server {
        hören Sie 80;
        access_log /var/log/nginx/access.log kvpairs; # Legen Sie das Protokollformat unter dieser Regel auf das benutzerdefinierte Format über root /usr/share/nginx/html fest.
    }
}

5. NJS unterstützte Befehle

Referenzdokumentation

NJS unterstützt nicht viele Anweisungen. Um komplexe Funktionen zu erreichen, muss es in Kombination mit anderen Nginx-Anweisungen verwendet werden.

Nachfolgend sind einige häufig verwendete Anweisungen aufgeführt.

js_body_filter ändert den Hauptteil der Antwort

Syntax: js_body_filter-Funktion | Modul.Funktion [Puffertyp=Zeichenfolge | Puffer];
Standard: -
Kontext: Standort, limit_except
Diese Anweisung erschien in der Version 0.5.2.

Beispiel

/**
* Funktion zum Verarbeiten des Antworttexts * @param { object } r - HTTP-Objekt * @param { buffer_type } data - Daten des Anforderungstexts * @param { boolean } flags - ob es sich um den letzten Datenblock handelt */

Funktion Filter(r, Daten, Flags) {
    r.sendBuffer(data.toLowerCase(), flags);
}

js_content verarbeitet die Anfrage-Antwort

Syntax: js_content-Funktion | Modul.Funktion;
Standard: -
Kontext: Standort, limit_except

Beispiel

http {
    # JS-Modul importieren js_import http.js;                 
    Server {
        hören Sie 80;
        Standort /Inhalt {
            # Geben Sie die js-Funktion an, die über die js_content-Anweisung ausgeführt werden soll js_content http.content;
        }
    }
}
// http.js-Dateifunktion content(r) {
    r.status = 200;
    r.headersOut['Inhaltstyp'] = "text/plain; Zeichensatz=utf-8";
    r.headersOut['Inhaltslänge'] = 12;
    r.sendHeader();
    r.send("Ich bin zufrieden");
    r.fertigstellen()
}

exportiere Standard { Inhalt }

js_header_filter ändert den zurückgegebenen Anforderungsheader

Syntax: js_header_filter-Funktion | Modul.Funktion;
Standard: -
Kontext: Standort, limit_except
Diese Anweisung erschien in der Version 0.5.1.

js_import importiert eine js-Datei

Syntax: js_import module.js | export_name aus module.js;
Standard: -
Kontext: http
Diese Anweisung erschien in der Version 0.4.0.

Beispiel

http {
    # JS-Modul importieren. Der Dateiname wird als Namespace des Moduls verwendet. Wenn Sie auf eine Funktion verweisen, können Sie sie mit [Dateiname].[Funktionsname] referenzieren js_import http.js;                 
    Server {
        hören Sie 80;
        Standort /Inhalt {
            # Geben Sie die js-Funktion an, die über die js_content-Anweisung ausgeführt werden soll js_content http.content;
        }
    }
}

js_set setzt Variablen

Syntax: js_set $variable Funktion | Modul.Funktion;
Standard: -
Kontext: http

Die von dieser Anweisung referenzierte Funktion wird ausgeführt, wenn die Variable zum ersten Mal referenziert wird. Innerhalb der Funktion werden nur synchrone Operationen unterstützt.

Verweise

  • NJS unterstützt js-Syntax: https://nginx.org/en/docs/njs/compatibility.html?_ga=2.128028686.301589667.1638621670-451035464.1638621670
  • Nutzen Sie die Leistung und den Komfort von JavaScript für jede Anfrage mit dem NGINX JavaScript-Modul: https://www.nginx.com/blog/harnessing-power-convenience-of-javascript-for-each-request-with-nginx-javascript-module
  • NJS-Moduldokumentation: http://nginx.org/en/docs/http/ngx_http_js_module.html#example
  • Quellcode: https://hg.nginx.org/njs/?_ga=2.99259804.301589667.1638621670-451035464.1638621670
  • Integrierte Objekte, Methoden, Funktionen von NJS: https://nginx.org/en/docs/njs/reference.html
  • NJS-Anwendungsbeispiel: https://github.com/nginx/njs-examples/#hello-world-example-http-hello

Zusammenfassen

Dies ist das Ende dieses Artikels über die Verwendung des NJS-Moduls zum Einführen von JS-Skripten in die Nginx-Konfiguration. Weitere relevante Inhalte zum Einführen von JS-Skripten in die Nginx-Konfiguration finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

<<:  MySQL-Datenbank-Master-Slave-Replikation und Lese-/Schreibtrennung

>>:  Mehrere Möglichkeiten zum Einfügen von SVG in HTML-Seiten

Artikel empfehlen

Implementierung von Socket-Optionen in der Linux-Netzwerkprogrammierung

Socket-Optionsfunktion Funktion: Methoden zum Les...

JavaScript zur Implementierung eines einziehbaren sekundären Menüs

Der spezifische Code zur Implementierung des einz...

Eine kurze Einführung in den MySQL-Dialekt

Wenn wir einmal von Datenbanken absehen, was ist ...

So konfigurieren Sie Umgebungsvariablen in einer Linux-Umgebung

JDK-Downloadadresse: http://www.oracle.com/techne...

Zusammenfassung mehrerer häufig verwendeter CentOS7-Images basierend auf Docker

Inhaltsverzeichnis 1 Docker installieren 2 Konfig...

Vue3 realisiert den Bildlupeneffekt

In diesem Artikelbeispiel wird der spezifische Co...

Welche Eigenschaften sollte eine gute Werbung haben?

Manche Leute sagen, dass Werbung machen wie ein Me...

Analyse der gemeinsamen Indexfunktion von MySQL und Anwendungsbeispiele

Dieser Artikel veranschaulicht anhand von Beispie...

Sammlung von 12 praktischen Web-Online-Tools

1. Favicon.cc Um ICO-Symbol-Websites online zu er...

So implementieren Sie den Vue-Timer

In diesem Artikelbeispiel wird der spezifische Co...