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:
Notiz : Zum Zeitpunkt des Schreibens dieses Artikels ist das WebAssembly-Modul eine Technologievorschau – weitere Einzelheiten unten.
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.
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 sollModul
zeigt auf einen kompilierten WebAssembly-BytecodeZugriff
ist eine Funktion der Wasmtime-Laufzeit, die es der Application ermöglicht, auf Ressourcen außerhalb der Sandbox zuzugreifenrequest_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“
}
}
}
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.
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."