WebAssembly côté serveur avec NGINX Unit

NGINX | 05 septembre 2023

WebAssembly (abrégé en « Wasm ») a beaucoup à offrir au monde des applications web. Dans le navigateur, il fournit un environnement d’exécution sécurisé et isolé qui permet aux développeurs frontend de travailler avec divers langages de haut niveau (et pas seulement JavaScript !) sans compromettre les performances. Côté backend (serveur), la prise en charge multiplateforme et la portabilité multiarchitecture de WebAssembly promettent de faciliter plus que jamais le développement, le déploiement et la mise à l’échelle.

Chez NGINX, nous imaginons un monde où vous pouvez créer un module WebAssembly côté serveur et l’exécuter partout, sans modification ni multiplication des pipelines de compilation. Ainsi, votre module WebAssembly pourrait être utilisé dès la phase de développement local, puis déployé jusque dans des environnements multicloud critiques.

Avec la sortie de NGINX Unit 1.31, nous sommes ravis de concrétiser cette vision. NGINX Unit est un serveur universel d’applications web qui exécute le code applicatif tout en prenant en charge d’autres fonctions essentielles telles que TLS, les fichiers statiques et le routage des requêtes. De plus, NGINX Unit offre toutes ces fonctionnalités tout en garantissant une expérience de développement cohérente pour sept environnements d’exécution de langages de programmation, auxquels s’ajoute désormais WebAssembly.

L’ajout de WebAssembly à NGINX Unit est pertinent à bien des égards :

  • Le modèle requête-réponse de HTTP s’adapte naturellement au flux d’octets d’entrée/sortie (E/S) de l’environnement isolé WebAssembly.
  • Les développeurs peuvent bénéficier de la productivité offerte par les langages de haut niveau sans compromettre les performances d’exécution.
  • Le routeur de requêtes de NGINX Unit peut faciliter la création d’applications complexes à partir de plusieurs modules WebAssembly.
  • Le démarrage rapide de WebAssembly le rend tout aussi adapté au déploiement de microservices et de fonctions individuels qu’à celui d’applications complètes.
  • La portabilité universelle et la compatibilité multiplateforme permettent de développer localement sans pipelines de compilation complexes.
  • NGINX Unit fournit déjà une isolation propre à chaque application, et le bac à sable WebAssembly renforce encore la sécurité lors de l’exécution de code non fiable.

Remarque : à l’heure où nous écrivons ces lignes, le module WebAssembly est disponible en version préliminaire. Vous trouverez plus de détails ci-dessous.

Comment fonctionne le module WebAssembly de NGINX Unit ?

L’architecture de NGINX Unit dissocie les protocoles réseau de l’environnement d’exécution de l’application. Le processus unitd: router traite la requête HTTP entrante et prend en charge la couche TLS si nécessaire. Une fois le traitement à appliquer à cette requête déterminé, le « contexte HTTP » (URI, en-têtes et corps) est transmis à l’environnement d’exécution de l’application.

De nombreux langages de programmation définissent précisément la manière dont le contexte HTTP est mis à la disposition du code de l’application, ainsi que la façon dont un développeur peut accéder à l’URI, aux en-têtes et au corps de la requête. NGINX Unit fournit plusieurs modules de langage qui mettent en œuvre une couche d’interface entre le routeur de NGINX Unit et l’environnement d’exécution de l’application.

Le module de langage WebAssembly pour NGINX Unit fournit une couche d’interface similaire entre l’environnement d’exécution WebAssembly et le processus du routeur. La mémoire linéaire du bac à sable WebAssembly est initialisée avec le contexte HTTP de la requête en cours, et la réponse finalisée est renvoyée au routeur afin d’être transmise au client.

L’environnement d’exécution isolé est fourni par le moteur d’exécution Wasmtime. Le schéma ci-dessous illustre le cheminement d’une requête HTTP depuis le client, en passant par le routeur, jusqu’au module WebAssembly exécuté par Wasmtime.

Schéma du cheminement d’une requête HTTP depuis le client, via le routeur, jusqu’au module WebAssembly exécuté par Wasmtime.

Exécution de modules WebAssembly sur NGINX Unit

Configurer NGINX Unit pour exécuter un module WebAssembly est aussi simple que pour n’importe quel autre langage. Dans l’extrait de configuration ci-dessous, une application nommée « helloworld » possède les attributs suivants :

  • type définit le module de langage à charger pour cette application
  • module pointe vers un bytecode WebAssembly compilé
  • access est une fonctionnalité de l’environnement d’exécution Wasmtime qui permet à l’application d’accéder à des ressources situées en dehors du bac à sable
  • request_handler, malloc_handler et free_handler sont associés aux fonctions du SDK qui transfèrent le contexte HTTP à Wasmtime (nous y reviendrons dans la section suivante)
{
   "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"
      }
   }
}

Trouver le contexte HTTP dans le bac à sable WebAssembly

Comme indiqué précédemment, le module de langage WebAssembly de NGINX Unit initialise l’environnement d’exécution isolé WebAssembly avec le contexte HTTP de la requête en cours. Alors que de nombreux environnements d’exécution de langages de programmation fournissent un accès natif et direct aux métadonnées HTTP, il n’existe aucune norme de ce type pour WebAssembly.

Nous pensons que la norme WASI-HTTP répondra à terme à ce besoin. En attendant, nous proposons un kit de développement logiciel (SDK) pour Rust et C. Le SDK Unit-Wasm facilite la création d’applications web et d’API compilables en WebAssembly et exécutables sur NGINX Unit. Dans notre guide pratique consacré à WebAssembly, vous pourrez découvrir l’environnement de développement et les étapes de compilation.

Malgré notre vision et notre volonté d’exploiter pleinement le potentiel de WebAssembly en tant qu’environnement d’exécution universel, les applications développées avec ce SDK ne fonctionneront que sur NGINX Unit. C’est pourquoi nous proposons la prise en charge de WebAssembly sous forme d’aperçu technologique : nous prévoyons de la remplacer par la prise en charge de WASI-HTTP dès que cela sera possible.

Essayez la version préliminaire de la technologie

La version préliminaire vise à présenter le potentiel de WebAssembly côté serveur, tout en proposant un serveur léger pour exécuter des applications web. Nous vous invitons à la tester librement, à l’expérimenter et à nous faire part de vos commentaires. Nous serions ravis d’échanger avec vous sur le Slack de la communauté NGINX ou via le dépôt GitHub de NGINX Unit.

Pour commencer, installez NGINX Unit et consultez le guide pratique de WebAssembly


Partager
Mots-clés : News, Tech, F5 NGINX, 2023

À propos de l’auteur

Liam Crilly
Liam CrillyDirecteur senior de la gestion des produits

Autres articles de Liam Crilly

Articles de blog associés

Tendances actuelles des technologies cloud natives, de l’ingénierie de plateforme et de l’IA
NGINX | 13/10/2025

Tendances actuelles des technologies cloud natives, de l’ingénierie de plateforme et de l’IA

Découvrez les principaux enseignements tirés des réponses à l’enquête annuelle F5 NGINX sur les dernières tendances en matière de technologies cloud natives, de sécurité, d’ingénierie de plateforme et d’IA.

Quels contrôleurs Ingress NGINX sont affectés par les vulnérabilités CVE-2022-4886, CVE-2023-5043 et CVE-2023-5044 ?
NGINX | 03/11/2023

Quels contrôleurs Ingress NGINX sont affectés par les vulnérabilités CVE-2022-4886, CVE-2023-5043 et CVE-2023-5044 ?

Lorsque de nouvelles CVE sont signalées, il est facile de ne plus savoir si elles concernent un outil de contrôleur Ingress NGINX particulier, car il existe plusieurs projets. Cet article présente les CVE et explique comment distinguer les différents projets de contrôleurs Ingress afin de dissiper toute confusion.

Votre API est-elle en temps réel ? Testez sa latence avec l’outil rtapi de NGINX
NGINX | 11/03/2020

Votre API est-elle en temps réel ? Testez sa latence avec l’outil rtapi de NGINX

Votre API répond-elle aux requêtes en moins de 30 ms ? Si ce n’est pas le cas, il ne s’agit pas d’une API en temps réel offrant la faible latence exigée par la grande majorité des organisations. Mesurez la latence de votre API avec l’outil rtapi de NGINX et découvrez comment NGINX peut l’aider à offrir une réactivité en temps réel.

Un testeur d’expressions régulières pour NGINX et NGINX Plus
NGINX | 11/06/2019

Un testeur d’expressions régulières pour NGINX et NGINX Plus

Le testeur d’expressions régulières (regex) pour NGINX et NGINX Plus vous évite de tâtonner en vous indiquant si une expression régulière utilisée dans un bloc location ou map correspond aux valeurs comme prévu. Il génère la configuration appropriée et affiche les valeurs des groupes de capture.

Caches partagés avec les clusters de cache NGINX Plus, partie 1
NGINX | 24/01/2017

Caches partagés avec les clusters de cache NGINX Plus, partie 1

Optimisez la capacité de votre cache web en le répartissant entre plusieurs serveurs de cache web NGINX ou NGINX Plus. Découvrez comment procéder dans cet article.

Introduction aux microservices
NGINX | 19/05/2015

Introduction aux microservices

Les microservices suscitent actuellement beaucoup d’intérêt. Cet article de blog est le premier d’une série de sept consacrée à la conception, au développement et au déploiement de microservices.