njs ist ein JavaScript-Interpreter in einem
kompakten Webserver, mit dem Sie neue Nginx-Variablen erstellen und Stage-Handler anfordern können. Wofür ist njs gut? Was kann nicht? Und warum haben sie das überhaupt gemacht? Diese und andere Fragen werden von Dmitry Volyntsev (
xeioex ), dem
Nginx- Entwickler und Hauptentwickler des njs-Interpreters, beantwortet.

- Dmitry, warum brauchten Sie Skripte in Nginx-Konfigurationen?
- Der erste Grund ist die
if
Richtlinie. Leute, die sie zum ersten Mal gesehen haben, denken, dass sie unbedingt verwendet werden können. Eigentlich ist das nicht so - die Nginx-Konfiguration ist deklarativ. Im folgenden Beispiel könnte man denken, dass die Antwort zwei Überschriften hat: X-First und X-Second. Aber nur der zweite Header wird in die Antwort aufgenommen, weil nginx so angeordnet ist: Wenn wir zwei if-Direktiven schreiben, wird der letzte ausgewählt.
location /only-one-if { set $true 1; if ($true) { add_header X-First 1; } if ($true) { add_header X-Second 2; }
Der zweite Grund ist, wozu Nginx jetzt gekommen ist. Zuvor wurde es zum Zwischenspeichern von Statiken und Anforderungen sowie zum Lastenausgleich verwendet - ein klassischer Proxy-Satz. Die Verbreitung von Mikrodiensten hat den Anwendungsbereich von Nginx untergraben. Wenn frühere Konfigurationseinstellungen in einigen Sprachen mit einem Speicherortpaar auf mehreren Backends endeten, haben wir mit der Microservice-Architektur mehr bewegliche Teile. Das Backend ist zu einer Reihe kleiner Komponenten geworden. Die Autorisierungslogik muss beispielsweise bei jedem Microservice dupliziert oder beispielsweise im Frontend entfernt werden. Um eine erweiterte Autorisierung zu implementieren, sind in nginx nicht immer genügend Lösungsmechanismen integriert.
Drittens akzeptieren in Nginx viele Direktiven dynamisch berechnete Ausdrücke, zum Beispiel:
proxy cache bypass $cookie_nocache $arg_nocache;
Sie können Variablen miteinander oder mit Literalzeichenfolgen verketten. Dies reicht jedoch nicht aus, und ich hätte gerne leistungsfähigere Tools, um beispielsweise den Hash zu berechnen, mit numerischen Daten zu arbeiten und in Groß- und Kleinschreibung umzuwandeln.
Um alle Engpässe in Nginx zu erweitern, müssen Sie entweder Ihre eigene Syntax entwickeln oder etwas Fertiges verwenden. Wir sind zu dem Schluss gekommen, dass es am besten ist, eine vorhandene Skript-Programmiersprache zu verwenden. Entwickler müssen daher keine neue Sprache lernen, was auch Zeit spart und die Einstiegsschwelle senkt. Wir haben JavaScript gewählt.
- Und warum JavaScript?
- Wir haben uns aus mehreren Gründen für JavaScript entschieden:
- Ein moderner Dialekt, der sich gut für Entwickler eignet, die von anderen Sprachen wechseln.
- C-ähnlicher Stil. Dies ist wichtig, da die nginx-Konfiguration geschweifte Klammern verwendet. In Zukunft möchten wir die Möglichkeit hinzufügen, JS-Code direkt in die Konfiguration zu schreiben. Zahnspangen helfen uns dabei. In Lua zum Beispiel wird die Rolle der geschweiften Klammern von Anfang bis Ende ausgeführt - dies ist unpraktisch.
- Das JavaScript-Modell passt gut zur Nginx-Architektur.
"Also wurde Lua auch in Betracht gezogen?" Liegt es am Anfang und am Ende?
- Es gibt bereits ein fertiges Drittanbieterprojekt OpenResty. Wenn Sie nicht auf Details eingehen, handelt es sich im Wesentlichen um Nginx + Lua, aber es hat eine Architektur, die Nginx zuwiderläuft. Wir wollten Überschneidungen mit diesem Ökosystem vermeiden. Darüber hinaus gibt es mehrere weitere Gründe:
- Lua hat eine pascalartige Syntax.
- Arrays werden von 1 indiziert.
- Lua ist immer noch eine Nischenprogrammiersprache.
- Wie ist njs im Vergleich zu Wettbewerbern?
- Wir haben njs im Vergleich zu den bekannten Motoren V8 und SpiderMonkey bewertet. Sie sind für Aufgaben in Nginx unwirksam, da sie von Browsern geschärft werden und sehr schwer sind und Nginx eine hohe Geschwindigkeit erfordert. Darüber hinaus entwickeln sich beide Engines schnell weiter, ihre API ist instabil. Schließlich können njs effizienter in nginx integriert werden:
Die Anzahl der pro Sekunde erstellten Kontexte- Welche Standards unterstützt njs?
- Im Moment sind fast alle Grundelemente der ECMAScript 5.1-Spezifikation implementiert, wobei die Elemente der Spezifikationen 6 und 7 eingestreut sind. Dies sind Standardobjekte wie Object, Array, String, Number, Date, RegExp, JSON. Schließungen, anonyme Funktionen und Arbeiten mit Ausnahmen werden vollständig unterstützt.
Wir setzen uns nicht als primäres Ziel die vollständige Einhaltung der Sprachspezifikation. Daher gibt es derzeit keine Unterstützung für
eval () , und wir planen bisher nicht, es hinzuzufügen. Wir planen jedoch, die Unterstützung für const hinzuzufügen und Schlüsselwörter sowie Pfeilfunktionen zuzulassen.
Was ist in der Lage und was ist im Moment nicht in der Lage zu njsEs ist wichtig, noch eines zu erwähnen: das Fehlen einer Müllabfuhr. Die meisten modernen Sprachen überwachen unabhängig die Lebensdauer von Objekten. Wenn das Objekt nicht mehr verwendet wird, wird es automatisch gelöscht. Sie können nicht auf diesen Mechanismus verzichten, aber normalerweise müssen Sie etwas dafür opfern - die Arbeit des Programms verlangsamt sich oder stoppt sogar. In njs wird der Speicher erst freigegeben, wenn das Anforderungsobjekt freigegeben wurde.
Dieser Ansatz hat Vor- und Nachteile. Der Hauptnachteil besteht darin, dass Sie nicht effektiv mit langen Abfragen arbeiten können. Daher planen wir in Zukunft, die Speicherbereinigung als Option hinzuzufügen, um sie bei Bedarf zu aktivieren.
- Was ist njs nicht?
- Bevor ich diese Frage beantworte, möchte ich noch einmal wiederholen, dass die Hauptaufgabe von njs darin besteht, die Funktionen für die flexible Konfiguration von nginx und die Lösung von Aufgaben auf der Proxy-Seite zu erweitern.
Nun die Frage selbst. Was ist im Voraus zu beachten?
- njs ist kein Ersatz für Node.js.
- Das nginx + njs-Bundle ist kein Anwendungsserver.
- njs implementiert ECMAScript-Standards nicht vollständig, da eval () nicht unterstützt wird.
Wenn dieses Thema für Sie äußerst relevant ist und Sie sich nach weiteren Details sehnen, empfehlen wir Ihnen, sich die Videoaufzeichnung des Berichts von Dmitry Volintsev bei HighLoad ++ Siberia 2018 anzusehen, wo er ihn von allen Seiten enthüllte.
Wir laden außerdem alle Profis ein, ihre Berichte an die
HighLoad ++ 2018- Konferenz im November zu
senden , die am 8. und 9. November in
Skolkovo stattfinden wird. Wenn Sie eine einzigartige und interessante Erfahrung haben und bereit sind, diese zu teilen, registrieren Sie sich vor dem 1. September und füllen Sie das
Formular aus .
Wenn Sie Angst haben, öffentlich zu sprechen, haben wir eine sogenannte
Sprecherschule , in der wir helfen, diese Fähigkeiten kostenlos zu fördern.