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 sandboxé qui permet aux développeurs front-end de travailler dans une variété de langages de haut niveau (pas seulement JavaScript !) sans compromettre les performances. Et au niveau du backend (côté serveur), la prise en charge multiplateforme et la portabilité multi-architecture de WebAssembly promettent de rendre le développement, le déploiement et l'évolutivité plus faciles que jamais.
Chez NGINX, nous envisageons un monde dans lequel vous pouvez créer un module WebAssembly côté serveur et l'exécuter n'importe où, sans modification et sans plusieurs pipelines de build. Au lieu de cela, votre module WebAssembly démarrerait au niveau du développement local et s'exécuterait jusqu'aux environnements multicloud critiques.
Avec la sortie de NGINX Unit 1.31 , nous sommes ravis de concrétiser cette vision. NGINX Unit est un serveur d'applications Web universel où le code application est exécuté aux côtés des autres attributs essentiels de TLS, des fichiers statiques et du routage des requêtes. De plus, NGINX Unit fait tout cela tout en offrant une expérience de développeur cohérente pour sept environnements d’exécution de langage de programmation , et désormais également WebAssembly.
L'ajout de WebAssembly à NGINX Unit est logique à plusieurs niveaux :
Note : Au moment de la rédaction de cet article, le module WebAssembly est un aperçu technologique – plus de détails ci-dessous.
L'architecture de l'unité NGINX dissocie les protocoles réseau de l'exécution de l' application . Le processus unitd: router
gère la requête HTTP entrante, en prenant en charge la couche TLS si nécessaire. Après avoir décidé quoi faire de cette demande, le « contexte HTTP » (URI, en-têtes et corps) est ensuite transmis à l’environnement d’exécution de application .
De nombreux langages de programmation ont une spécification précise sur la manière dont le contexte HTTP est mis à disposition du code de application et sur la manière dont un développeur peut accéder à l'URI, aux en-têtes et au corps. NGINX Unit fournit plusieurs modules de langage qui implémentent une couche d'interface entre le routeur de NGINX Unit et l'environnement d'exécution de 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 sandbox 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 pour transmission au client.
L'environnement d'exécution sandboxé est fourni par l'environnement d'exécution Wasmtime . Le diagramme ci-dessous illustre le flux d'une requête HTTP du client, via le routeur, vers le module WebAssembly exécuté par Wasmtime.
La configuration de 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, il existe une application appelée helloworld
avec ces attributs :
le type
définit le module de langue à charger pour cette applicationle module
pointe vers un bytecode WebAssembly compilél'accès
est une fonctionnalité de l'environnement d'exécution Wasmtime qui permet à l' application d'accéder aux ressources en dehors du sandboxrequest_handler
, malloc_handler
et free_handler
se rapportent aux fonctions SDK qui transfèrent le contexte HTTP vers Wasmtime (plus d'informations à ce sujet dans la section suivante){
"applications":{
"Bonjour le monde":{
"type": "wasm",
"module": "/chemin/vers/wasm_module.wasm",
"accéder":{
"système de fichiers":[
"/tmp",
"/var/tmp"
]
},
"request_handler": "luw_request_handler",
"malloc_handler": "luw_malloc_handler",
"free_handler": "luw_free_handler"
}
}
}
Comme mentionné ci-dessus, le module de langage WebAssembly de NGINX Unit initialise le sandbox d’exécution WebAssembly avec le contexte HTTP de la requête en cours. Alors que de nombreux environnements d'exécution de langage de programmation fourniraient un accès natif et direct aux métadonnées HTTP, aucune norme de ce type n'existe pour WebAssembly.
Nous espérons que la norme WASI-HTTP répondra finalement à ce besoin mais, en attendant, nous fournissons un kit de développement logiciel (SDK) pour Rust et C. Le SDK Unit-Wasm facilite l'écriture applications Web et d'API qui se compilent en WebAssembly et s'exécutent sur NGINX Unit. Dans notre guide pratique pour WebAssembly , vous pouvez explorer l'environnement de développement et les étapes de création.
Malgré notre vision et notre désir de réaliser le potentiel de WebAssembly en tant qu'environnement d'exécution universel, les applications créées avec ce SDK ne fonctionneront que sur NGINX Unit. C'est pourquoi nous introduisons le support WebAssembly en tant qu'aperçu technologique. Nous prévoyons de le remplacer par le support WASI-HTTP dès que cela sera possible.
L'aperçu technologique est là pour présenter le potentiel de WebAssembly côté serveur tout en fournissant un serveur léger pour l'exécution applications Web. Veuillez l’aborder avec un état d’esprit de type « testez les pneus » – expérimentez-le et faites-nous part de vos commentaires. Nous aimerions avoir de vos nouvelles sur le Slack de la communauté NGINX ou via le référentiel GitHub de l'unité NGINX .
Pour commencer, installez NGINX Unit et accédez au guide pratique de WebAssembly
« Cet article de blog peut faire référence à des produits qui ne sont plus disponibles et/ou qui ne sont plus pris en charge. Pour obtenir les informations les plus récentes sur les produits et solutions F5 NGINX disponibles, explorez notre famille de produits NGINX . NGINX fait désormais partie de F5. Tous les liens NGINX.com précédents redirigeront vers un contenu NGINX similaire sur F5.com."