BLOG | NGINX

Serverseitiges WebAssembly mit NGINX-Einheit

NGINX-Teil-von-F5-horiz-schwarz-Typ-RGB
Liam Crilly Miniaturbild
Liam Crilly
Veröffentlicht am 05. September 2023

WebAssembly (abgekürzt Wasm ) hat der Welt der Applications viel zu bieten. Im Browser bietet es eine sichere, in einer Sandbox ausgeführte Umgebung, die es Frontend-Entwicklern ermöglicht, in einer Vielzahl von höheren Programmiersprachen (nicht nur JavaScript!) zu arbeiten, ohne Kompromisse bei der Leistung einzugehen. Und auf der Backend-Seite (Serverseite) versprechen die plattformübergreifende Unterstützung und die Portabilität mehrerer Architekturen von WebAssembly, dass Entwicklung, Bereitstellung und Skalierbarkeit einfacher als je zuvor sein werden.

Bei NGINX stellen wir uns eine Welt vor, in der Sie ein serverseitiges WebAssembly-Modul erstellen und es überall ausführen können – ohne Änderungen und ohne mehrere Build-Pipelines. Stattdessen würde Ihr WebAssembly-Modul mit der lokalen Entwicklung beginnen und bis hin zu unternehmenskritischen Multi-Cloud-Umgebungen ausgeführt werden.

Wir freuen uns, diese Vision mit der Veröffentlichung von NGINX Unit 1.31 umzusetzen. NGINX Unit ist ein universeller Web-App-Server, auf dem Application neben den anderen wesentlichen Attributen von TLS, statischen Dateien und Anforderungsweiterleitung ausgeführt wird. Darüber hinaus bietet NGINX Unit all dies und sorgt gleichzeitig für eine konsistente Entwicklererfahrung für sieben Laufzeitumgebungen in Programmiersprachen und jetzt auch für WebAssembly.

Das Hinzufügen von WebAssembly zu NGINX Unit ist auf vielen Ebenen sinnvoll:

  • Das Anforderung-Antwort-Muster von HTTP passt natürlich zum Eingabe-/Ausgabe-Bytestream (I/O) der WebAssembly-Sandbox.
  • Entwickler können sich über eine hohe Sprachproduktivität freuen, ohne Kompromisse bei der Laufzeitleistung eingehen zu müssen.
  • Der Anforderungsrouter von NGINX Unit kann die Erstellung komplexer Applications aus mehreren WebAssembly-Modulen erleichtern.
  • Aufgrund der schnellen Startzeit von WebAssembly eignet es sich gleichermaßen für die Bereitstellung einzelner Microservices und Funktionen sowie sogar voll funktionsfähiger Applications.
  • Universelle Portabilität und plattformübergreifende Kompatibilität ermöglichen lokale Entwicklung ohne komplexe Build-Pipelines.
  • NGINX Unit bietet bereits eine Isolierung pro Anwendung und die WebAssembly-Sandbox macht das Ausführen nicht vertrauenswürdigen Codes noch sicherer.

Notiz : Zum Zeitpunkt des Schreibens dieses Artikels ist das WebAssembly-Modul eine Technologievorschau – weitere Einzelheiten unten.

Wie funktioniert das NGINX Unit WebAssembly-Modul?

Die Architektur der NGINX Unit entkoppelt Netzwerkprotokolle von der Application . Der unitd: Router -Prozess verarbeitet die eingehende HTTP-Anfrage und kümmert sich bei Bedarf um die TLS-Schicht. Nachdem entschieden wurde, was mit dieser Anfrage geschehen soll, wird der „HTTP-Kontext“ (URI, Header und Text) an die Application übergeben.

Viele Programmiersprachen verfügen über eine genaue Spezifikation, wie der HTTP-Kontext dem Application zur Verfügung gestellt wird und wie ein Entwickler auf URI, Header und Body zugreifen kann. NGINX Unit bietet mehrere Sprachmodule, die eine Schnittstellenschicht zwischen dem Router von NGINX Unit und der Application implementieren.

Das WebAssembly-Sprachmodul für NGINX Unit bietet eine ähnliche Schnittstellenschicht zwischen der WebAssembly-Laufzeit und dem Routerprozess. Der lineare Speicher der WebAssembly-Sandbox wird mit dem HTTP-Kontext der aktuellen Anforderung initialisiert und die endgültige Antwort wird zur Übertragung an den Client an den Router zurückgesendet.

Die Sandbox-Ausführungsumgebung wird von der Wasmtime -Laufzeit bereitgestellt. Das folgende Diagramm veranschaulicht den Ablauf einer HTTP-Anfrage vom Client über den Router zum von Wasmtime ausgeführten WebAssembly-Modul.

Diagramm des Flusses einer HTTP-Anfrage vom Client über den Router zum von Wasmtime ausgeführten WebAssembly-Modul.

Ausführen von WebAssembly-Modulen auf einer NGINX-Einheit

Die Konfiguration von NGINX Unit zur Ausführung eines WebAssembly-Moduls ist genauso einfach wie bei jeder anderen Sprache. Im folgenden Konfigurationsausschnitt gibt es eine Application namens „HelloWorld“ mit diesen Attributen:

  • Typ definiert das Sprachmodul, das für diese Application geladen werden soll
  • Modul zeigt auf einen kompilierten WebAssembly-Bytecode
  • Zugriff ist eine Funktion der Wasmtime-Laufzeit, die es der Application ermöglicht, auf Ressourcen außerhalb der Sandbox zuzugreifen
  • request_handler , malloc_handler und free_handler beziehen sich auf die SDK-Funktionen, die den HTTP-Kontext an Wasmtime übertragen (mehr dazu im nächsten Abschnitt)
{
"Applications":{
"Hallo Welt":{
"Typ": "wasm",
"Modul":"/Pfad/zu/wasm_module.wasm",
"Zugang":{
"Dateisystem":[
"/tmp",
„/var/tmp“
]
},
"Anforderungshandler": "luw_Anforderungshandler",
„malloc_handler“: „luw_malloc_handler“,
„free_handler“: „luw_free_handler“
}
}
}

Suchen nach HTTP-Kontext in der WebAssembly-Sandbox

Wie oben erwähnt, initialisiert das WebAssembly-Sprachmodul von NGINX Unit die WebAssembly-Ausführungs-Sandbox mit dem HTTP-Kontext der aktuellen Anforderung. Während viele Laufzeitumgebungen für Programmiersprachen nativen, direkten Zugriff auf die HTTP-Metadaten bieten, gibt es für WebAssembly keinen solchen Standard.

Wir gehen davon aus, dass der WASI-HTTP- Standard diesen Bedarf letztendlich decken wird, stellen in der Zwischenzeit jedoch ein Software Development Kit (SDK) für Rust und C bereit. Das Unit-Wasm SDK erleichtert das Schreiben von Applications und APIs, die in WebAssembly kompiliert und auf NGINX Unit ausgeführt werden können. In unserer Anleitung für WebAssembly können Sie die Entwicklungsumgebung erkunden und Schritte erstellen.

Trotz unserer Vision und unseres Wunsches, das Potenzial von WebAssembly als universelle Laufzeitumgebung auszuschöpfen, laufen mit diesem SDK erstellte Applications nur auf der NGINX Unit. Aus diesem Grund führen wir WebAssembly-Unterstützung als Technologievorschau ein – wir gehen davon aus, dass wir sie so bald wie möglich durch WASI-HTTP-Unterstützung ersetzen werden.

Testen Sie die Technologievorschau

Die Technologievorschau soll das Potenzial von serverseitigem WebAssembly demonstrieren und gleichzeitig einen leichten Server zum Ausführen von Applications bereitstellen. Bitte gehen Sie mit der Einstellung an die Sache heran, experimentieren Sie damit und geben Sie uns Feedback. Wir würden uns freuen, im NGINX Community Slack oder über das NGINX Unit GitHub-Repo von Ihnen zu hören.

Um zu beginnen, installieren Sie NGINX Unit und springen Sie zur Anleitung für WebAssembly


„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."