Serverseitiges WebAssembly mit NGINX Unit

NGINX | 05. September 2023

WebAssembly (abgekürzt Wasm) hat der Welt der Webanwendungen viel zu bieten. Im Browser stellt es eine sichere, isolierte Ausführungsumgebung bereit, die es Frontend-Entwicklern ermöglicht, mit einer Vielzahl höherer Programmiersprachen (nicht nur JavaScript!) zu arbeiten, ohne Abstriche bei der Leistung machen zu müssen. Und im Backend (serverseitig) versprechen die plattformübergreifende Unterstützung und die Portabilität über verschiedene Architekturen hinweg von WebAssembly, Entwicklung, Bereitstellung und Skalierung einfacher denn je zu machen.

Wir bei NGINX stellen uns eine Welt vor, in der Sie ein serverseitiges WebAssembly-Modul erstellen und überall ausführen können – ohne Änderungen und ohne mehrere Build-Pipelines. Ihr WebAssembly-Modul würde stattdessen von der lokalen Entwicklung bis hin zu geschäftskritischen Multi-Cloud-Umgebungen durchgängig eingesetzt.

Mit der Veröffentlichung von NGINX Unit 1.31 freuen wir uns, diese Vision Wirklichkeit werden zu lassen. NGINX Unit ist ein universeller Webanwendungsserver, auf dem Anwendungscode zusammen mit anderen wesentlichen Funktionen wie TLS, der Bereitstellung statischer Dateien und dem Routing von Anfragen ausgeführt wird. Darüber hinaus bietet NGINX Unit dabei eine einheitliche Entwicklererfahrung für sieben Programmiersprachen-Laufzeitumgebungen und jetzt auch für WebAssembly.

Die Integration von WebAssembly in NGINX Unit ist in vielerlei Hinsicht sinnvoll:

  • Das Anfrage-Antwort-Muster von HTTP passt ideal zum Byte-Datenstrom für Ein- und Ausgabe (I/O) der WebAssembly-Sandbox.
  • Entwickler können von der Produktivität höherer Programmiersprachen profitieren, ohne Abstriche bei der Laufzeitleistung machen zu müssen.
  • Der Request-Router von NGINX Unit erleichtert die Erstellung komplexer Anwendungen aus mehreren WebAssembly-Modulen.
  • Dank seiner kurzen Startzeit eignet sich WebAssembly gleichermaßen für die Bereitstellung einzelner Microservices und Funktionen wie auch vollständiger Anwendungen.
  • Universelle Portabilität und plattformübergreifende Kompatibilität ermöglichen die lokale Entwicklung ohne komplexe Build-Pipelines.
  • NGINX Unit bietet bereits eine anwendungsspezifische Isolierung, und die WebAssembly-Sandbox macht die Ausführung von nicht vertrauenswürdigem Code noch sicherer.

Hinweis: Zum Zeitpunkt der Erstellung dieses Artikels befindet sich das WebAssembly-Modul in der Technologievorschau – weitere Einzelheiten finden Sie unten.

Wie funktioniert das WebAssembly-Modul von NGINX Unit?

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

Viele Programmiersprachen legen genau fest, wie der HTTP-Kontext dem Anwendungscode zur Verfügung gestellt wird und wie Entwickler auf URI, Header und Body zugreifen können. NGINX Unit bietet mehrere Sprachmodule, die eine Schnittstellenschicht zwischen dem Router von NGINX Unit und der Anwendungslaufzeit implementieren.

Das WebAssembly-Sprachmodul für NGINX Unit stellt eine ähnliche Schnittstellenschicht zwischen der WebAssembly-Laufzeitumgebung und dem Router-Prozess bereit. Der lineare Speicher der WebAssembly-Sandbox wird mit dem HTTP-Kontext der aktuellen Anfrage initialisiert, und die fertiggestellte Antwort wird zur Übertragung an den Client an den Router zurückgesendet.

Die isolierte Ausführungsumgebung wird von der Wasmtime-Laufzeitumgebung bereitgestellt. Das folgende Diagramm veranschaulicht den Ablauf einer HTTP-Anfrage vom Client über den Router bis zum WebAssembly-Modul, das von Wasmtime ausgeführt wird.

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

WebAssembly-Module auf NGINX Unit ausführen

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

  • type definiert das Sprachmodul, das für diese Anwendung geladen werden soll
  • module verweist auf kompilierten WebAssembly-Bytecode
  • access ist eine Funktion der Wasmtime-Laufzeitumgebung, die es der Anwendung 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":{
      "helloworld":{
         "type":"wasm",
         "module":"/path/to/wasm_module.wasm",
         "access":{
            "filesystem":[
               "/tmp",
               "/var/tmp"
            ]
         },
         "request_handler":"luw_request_handler",
         "malloc_handler":"luw_malloc_handler",
         "free_handler":"luw_free_handler"
      }
   }
}

HTTP-Kontext innerhalb der WebAssembly-Sandbox finden

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

Wir gehen davon aus, dass der WASI-HTTP-Standard diesen Bedarf letztlich erfüllen wird. Bis dahin stellen wir jedoch ein Software Development Kit (SDK) für Rust und C bereit. Mit dem Unit-Wasm SDK lassen sich Webanwendungen und APIs, die zu WebAssembly kompiliert und auf NGINX Unit ausgeführt werden, ganz einfach entwickeln. In unserem Praxisleitfaden für WebAssembly erfahren Sie mehr über die Entwicklungsumgebung und die einzelnen Build-Schritte.

Trotz unserer Vision und unseres Bestrebens, das Potenzial von WebAssembly als universelle Laufzeitumgebung auszuschöpfen, können mit diesem SDK erstellte Anwendungen nur auf NGINX Unit ausgeführt werden. Daher führen wir die WebAssembly-Unterstützung als Technologievorschau ein – wir gehen davon aus, sie durch die Unterstützung von WASI-HTTP zu ersetzen, sobald dies möglich ist.

Testen Sie die Technologievorschau

Die Technologie-Vorschau soll das Potenzial von serverseitigem WebAssembly aufzeigen und zugleich einen schlanken Server für die Ausführung von Webanwendungen bereitstellen. Betrachten Sie sie als Gelegenheit, alles unverbindlich auszuprobieren: Experimentieren Sie damit und geben Sie uns Feedback. Wir freuen uns, von Ihnen im NGINX Community Slack oder über das NGINX Unit GitHub-Repository zu hören.

Installieren Sie zunächst NGINX Unit und lesen Sie anschließend die Anleitung für WebAssembly


Teilen
Schlagwörter: News, Tech, F5 NGINX, 2023

Über den Autor

Liam Crilly
Liam CrillySenior Director, Produktmanagement

Weitere Blogbeiträge von Liam Crilly

Ähnliche Blogbeiträge

Die Zukunft von NGINX: Zurück zu unseren Open-Source-Wurzeln
NGINX | 23.08.2022

Die Zukunft von NGINX: Zurück zu unseren Open-Source-Wurzeln

Beim NGINX Sprint 2022 besinnen wir uns auf unsere Open-Source-Wurzeln. Erfahren Sie mehr über die Initiativen, die wir im kommenden Jahr verfolgen, und teilen Sie uns mit, was Sie sich wünschen.

Ein Leitfaden zur Auswahl eines Ingress-Controllers, Teil 1: Ermitteln Sie Ihre Anforderungen
NGINX | 08.09.2021

Ein Leitfaden zur Auswahl eines Ingress-Controllers, Teil 1: Ermitteln Sie Ihre Anforderungen

Ein Ingress-Controller kann eines der leistungsstärksten Tools in Ihrem Kubernetes-Stack sein. Erfahren Sie, wie Sie Ihre Ingress-Anforderungen ermitteln, um die beste Option auszuwählen.

Bereitstellung des NGINX Ingress Controllers auf Amazon EKS: So haben wir getestet
NGINX | 16.08.2021

Bereitstellung des NGINX Ingress Controllers auf Amazon EKS: So haben wir getestet

Wir haben kürzlich den Lösungsleitfaden zum NGINX Ingress Controller um Empfehlungen zur Dimensionierung für Amazon Elastic Kubernetes Service (EKS) ergänzt. In diesem Blogbeitrag erläutern wir, wie wir diese Empfehlungen erarbeitet haben, und stellen Ihnen alle Informationen zur Verfügung, die Sie benötigen, um selbst ähnliche Tests durchzuführen.

Protokollierung des Datenverkehrs zwischen NGINX und Upstream-Servern bei CDN77
NGINX | 12.12.2018

Protokollierung des Datenverkehrs zwischen NGINX und Upstream-Servern bei CDN77

Bei der Fehlersuche bei Datenverkehrsproblemen zwischen NGINX und Upstream-Servern konnte CDN77 die benötigten Daten nur aus dem Fehlerprotokoll mit aktivierter Debug-Ausgabe beziehen, was die Leistung beeinträchtigt und riesige Dateien erzeugt. Daher entwickelte das Team ein neues benutzerdefiniertes Modul, das ausschließlich die benötigten Daten protokolliert.

Ankündigung von NGINX Plus R16
NGINX | 05.09.2018

Ankündigung von NGINX Plus R16

NGINX Plus R16 ist eine einheitliche, elastische Ingress- und Egress-Schicht für Anwendungen, die die Funktionen eines Load Balancers, API-Gateways und einer WAF vereint und neue Features wie clusterfähige Ratenbegrenzung, Schlüssel-Wert-Speicher, „Random with Two Choices“, verbessertes UDP-Load-Balancing und vieles mehr bietet.

5 Gründe für den Umstieg auf softwarebasiertes Load Balancing
NGINX | 13.10.2016

5 Gründe für den Umstieg auf softwarebasiertes Load Balancing

Entdecken Sie fünf Gründe für den Wechsel zu einem softwarebasierten Load Balancer wie NGINX Plus, darunter Kosteneinsparungen, die Einführung von DevOps und eine einheitliche Lösung für alle Umgebungen.