In der Welt der Hochleistungs-Webserver ist NGINX eine beliebte Wahl, da es aufgrund seiner leichten und effizienten Architektur große Datenmengen verarbeiten kann. Mit der Einführung der gemeinsamen Wörterbuchfunktion als Teil des NGINX JavaScript-Moduls (njs) erreichen die Leistungsfunktionen von NGINX die nächste Stufe.
In diesem Blogbeitrag untersuchen wir die Funktionalität und Vorteile des gemeinsamen Wörterbuchs von njs und zeigen, wie NGINX Open Source eingerichtet wird, ohne dass beim Rotieren von SSL/TLS-Zertifikaten ein Neustart erforderlich ist.
Die neue Direktive js_shared_dict_zone
ermöglicht es Benutzern von NGINX Open Source, gemeinsam genutzte Speicherzonen für einen effizienten Datenaustausch zwischen Arbeitsprozessen zu aktivieren. Diese gemeinsam genutzten Speicherzonen fungieren als Schlüssel-Wert-Wörterbücher und speichern dynamische Konfigurationseinstellungen, auf die in Echtzeit zugegriffen und die geändert werden können.
Zu den Hauptvorteilen des gemeinsamen Wörterbuchs gehören:
evict-
Parameter entfernt das älteste Schlüssel-Wert-Paar, um Platz für neue Einträge zu schaffen.Einer der wirkungsvollsten Anwendungsfälle für das gemeinsame Wörterbuch ist die SSL/TLS-Rotation. Wenn Sie js_shared_dict_zone
verwenden, müssen Sie NGINX im Falle einer Aktualisierung des SSL/TLS-Zertifikats oder -Schlüssels nicht neu starten. Darüber hinaus erhalten Sie eine REST-ähnliche API zur Verwaltung von Zertifikaten auf NGINX.
Unten sehen Sie ein Beispiel der NGINX-Konfigurationsdatei, die den HTTPS-Server mit den Anweisungen js_set
und ssl_certificate
einrichtet. Die JavaScript-Handler verwenden js_set
, um das SSL/TLS-Zertifikat oder den Schlüssel aus einer Datei zu lesen.
Dieser Konfigurationsausschnitt verwendet das gemeinsame Wörterbuch, um Zertifikate und Schlüssel im gemeinsamen Speicher als Cache zu speichern. Wenn der Schlüssel nicht vorhanden ist, liest es das Zertifikat oder den Schlüssel von der Festplatte und legt es in den Cache.
Sie können auch einen Speicherort angeben, der den Cache löscht. Sobald Dateien auf der Festplatte aktualisiert werden (z. B. die Zertifikate und Schlüssel erneuert werden), erzwingt das gemeinsame Wörterbuch das Lesen von der Festplatte. Diese Anpassung ermöglicht die Rotation von Zertifikaten/Schlüsseln, ohne dass der NGINX-Prozess neu gestartet werden muss.
http { ... js_shared_dict_zone zone=kv:1m;
server { … # Legt eine njs-Funktion für die Variable fest. Gibt einen Zertifikat-/Schlüsselwert zurück js_set $dynamic_ssl_cert main.js_cert; js_set $dynamic_ssl_key main.js_key;
# Daten der Variable verwenden ssl_certificate data:$dynamic_ssl_cert; ssl_certificate_key data:$dynamic_ssl_key;
# ein Ort zum Löschen des Cache location = /clear { js_content main.clear_cache; # allow 127.0.0.1; # deny all; }
... }
Und hier ist die JavaScript-Implementierung für die Rotation von SSL/TLS-Zertifikaten und -Schlüsseln mit js_shared_dict_zone
:
Funktion js_cert(r) { if (r.variables['ssl_server_name']) { return read_cert_or_key(r, '.cert.pem'); } sonst { return ''; } } Funktion js_key(r) { if (r.variables['ssl_server_name']) { return read_cert_or_key(r, '.key.pem'); } sonst { return ''; } } /** * Ruft den Schlüssel-/Zertifikatswert aus dem gemeinsam genutzten Speicher ab oder greift auf die Festplatte zurück */ Funktion read_cert_or_key(r, Dateierweiterung) { let data = ''; let path = ''; const zone = 'kv'; let certName = r.variables.ssl_server_name; let prefix = '/etc/nginx/certs/'; path = Präfix + Zertifikatsname + Dateierweiterung; r.log('Auflösen${path} '); const key = ['certs', path].join(':'); const cache = zone && ngx.shared && ngx.shared[zone];
if (cache) { data = cache.get(key) || ''; if (data) { r.log(`Lesen${key} aus dem Cache`); returniere Daten; } } versuche { Daten = fs.readFileSync(Pfad, 'utf8'); r.log('Aus dem Cache lesen'); } fange (e) { Daten = ''; r.log(`Fehler beim Lesen aus der Datei:${path} . Fehler=${e} `); } if (cache && data) { try { cache.set(key, data); r.log('Im Cache gespeichert'); } catch (e) { const errMsg = `Fehler beim Schreiben in die gemeinsam genutzte Dict-Zone:${zone} . Fehler=${e} `; r.log(errMsg); } } Daten zurückgeben }
Durch das Senden der /clear
-Anforderung wird der Cache ungültig gemacht und NGINX lädt das SSL/TLS-Zertifikat oder den Schlüssel beim nächsten SSL/TLS-Handshake von der Festplatte. Darüber hinaus können Sie einen js_content
implementieren, der ein SSL/TLS-Zertifikat oder einen Schlüssel aus der Anforderung übernimmt und gleichzeitig den Cache speichert und aktualisiert.
Den vollständigen Code dieses Beispiels finden Sie im njs GitHub-Repository .
Die Funktion „Gemeinsames Wörterbuch“ ist ein leistungsstarkes Tool für die Programmierbarkeit Ihrer Anwendung, das erhebliche Vorteile hinsichtlich Rationalisierung und Skalierbarkeit bietet. Indem Sie die Funktionen von js_shared_dict_zone
nutzen, können Sie neue Wachstumsmöglichkeiten erschließen und steigende Verkehrsanforderungen effizient bewältigen.
Sind Sie bereit, Ihre NGINX-Bereitstellung mit js_shared_dict_zone
zu beschleunigen? Sie können Ihre NGINX-Bereitstellung mit js_shared_dict_zone
aktualisieren, um neue Anwendungsfälle freizuschalten und in unserer Dokumentation mehr über diese Funktion zu erfahren. Darüber hinaus können Sie im kürzlich eingeführten Projekt njs-acme ein vollständiges Beispiel einer gemeinsam genutzten Wörterbuchfunktion sehen, die es der Laufzeit des njs-Moduls ermöglicht, mit ACME-Anbietern zu arbeiten.
Wenn Sie an den ersten Schritten mit NGINX Open Source interessiert sind und Fragen haben, treten Sie dem NGINX Community Slack bei – stellen Sie sich vor und lernen Sie diese Community von NGINX-Benutzern kennen!
„Dieser Blogbeitrag kann auf Produkte verweisen, die nicht mehr verfügbar und/oder nicht mehr unterstützt werden. Die aktuellsten Informationen zu verfügbaren F5 NGINX-Produkten und -Lösungen finden Sie in unserer NGINX-Produktfamilie . NGINX ist jetzt Teil von F5. Alle vorherigen NGINX.com-Links werden auf ähnliche NGINX-Inhalte auf F5.com umgeleitet."