WebAssembly del lado del servidor con NGINX Unit

NGINX | 05 de septiembre de 2023

WebAssembly (abreviado como Wasm) tiene mucho que ofrecer al mundo de las aplicaciones web. En el navegador, proporciona un entorno de ejecución seguro y aislado que permite a los desarrolladores de frontend trabajar con diversos lenguajes de alto nivel (¡no solo JavaScript!) sin renunciar al rendimiento. Y en el backend (del lado del servidor), la compatibilidad multiplataforma y la portabilidad entre distintas arquitecturas de WebAssembly prometen facilitar más que nunca el desarrollo, el despliegue y la escalabilidad.

En NGINX, imaginamos un mundo en el que se pueda crear un módulo WebAssembly del lado del servidor y ejecutarlo en cualquier lugar, sin modificaciones ni múltiples procesos de compilación. Así, el módulo WebAssembly podría utilizarse desde el desarrollo local hasta en entornos multinube de misión crítica.

Con el lanzamiento de NGINX Unit 1.31, nos complace hacer realidad esta visión. NGINX Unit es un servidor universal de aplicaciones web en el que el código de las aplicaciones se ejecuta junto con otras funciones esenciales, como TLS, los archivos estáticos y el enrutamiento de solicitudes. Además, NGINX Unit ofrece todo esto a la vez que proporciona una experiencia de desarrollo coherente para siete entornos de ejecución de lenguajes de programación, y ahora también para WebAssembly.

Añadir WebAssembly a NGINX Unit tiene sentido por muchos motivos:

  • El patrón de solicitud-respuesta de HTTP encaja de forma natural con el flujo de bytes de entrada/salida (E/S) del entorno aislado de WebAssembly.
  • Los desarrolladores pueden beneficiarse de la productividad de los lenguajes de alto nivel sin renunciar al rendimiento en tiempo de ejecución.
  • El enrutador de solicitudes de NGINX Unit puede facilitar la creación de aplicaciones complejas a partir de varios módulos WebAssembly.
  • El rápido tiempo de arranque de WebAssembly lo hace igualmente adecuado para desplegar microservicios y funciones individuales, o incluso aplicaciones completas.
  • La portabilidad universal y la compatibilidad multiplataforma permiten desarrollar localmente sin necesidad de complejos procesos de compilación.
  • NGINX Unit ya proporciona aislamiento por aplicación, y el entorno aislado de WebAssembly hace que sea aún más seguro ejecutar código que no sea de confianza.

Nota: En el momento de redactar este documento, el módulo WebAssembly se encuentra en fase de vista previa tecnológica. Encontrará más información a continuación.

¿Cómo funciona el módulo WebAssembly de NGINX Unit?

La arquitectura de NGINX Unit desacopla los protocolos de red del entorno de ejecución de la aplicación. El proceso «unitd: router» gestiona la solicitud HTTP entrante y se ocupa de la capa TLS cuando es necesario. Tras decidir cómo procesar esta solicitud, el «contexto HTTP» (URI, cabeceras y cuerpo) se transfiere al entorno de ejecución de la aplicación.

Muchos lenguajes de programación cuentan con una especificación precisa sobre cómo se pone el contexto HTTP a disposición del código de la aplicación y cómo puede un desarrollador acceder al URI, las cabeceras y el cuerpo. NGINX Unit proporciona varios módulos de lenguaje que implementan una capa de interfaz entre el enrutador de NGINX Unit y el entorno de ejecución de la aplicación.

El módulo de lenguaje WebAssembly para NGINX Unit proporciona una capa de interfaz similar entre el entorno de ejecución de WebAssembly y el proceso del enrutador. La memoria lineal del entorno aislado de WebAssembly se inicializa con el contexto HTTP de la solicitud actual, y la respuesta final se devuelve al enrutador para que la transmita al cliente.

El entorno de ejecución aislado lo proporciona el entorno de ejecución Wasmtime. El siguiente diagrama ilustra el flujo de una solicitud HTTP desde el cliente, a través del enrutador, hasta el módulo WebAssembly ejecutado por Wasmtime.

Diagrama del flujo de una solicitud HTTP desde el cliente, pasando por el enrutador, hasta el módulo WebAssembly ejecutado por Wasmtime.

Ejecución de módulos WebAssembly en NGINX Unit

Configurar NGINX Unit para ejecutar un módulo WebAssembly es tan sencillo como hacerlo para cualquier otro lenguaje. En el siguiente fragmento de configuración, hay una aplicación llamada «helloworld» con estos atributos:

  • type define el módulo de lenguaje que se cargará para esta aplicación
  • module apunta a un código de bytes WebAssembly compilado
  • access es una función del entorno de ejecución Wasmtime que permite a la aplicación acceder a recursos externos al entorno aislado
  • request_handler, malloc_handler y free_handler están relacionados con las funciones del SDK que transfieren el contexto HTTP a Wasmtime (se explica con más detalle en la siguiente sección)
{
   "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"
      }
   }
}

Cómo encontrar el contexto HTTP dentro del entorno aislado de WebAssembly

Como se ha mencionado anteriormente, el módulo de lenguaje WebAssembly de NGINX Unit inicializa el entorno aislado de ejecución de WebAssembly con el contexto HTTP de la solicitud actual. Aunque muchos entornos de ejecución de lenguajes de programación proporcionarían acceso nativo y directo a los metadatos HTTP, no existe ningún estándar de este tipo para WebAssembly.

Esperamos que el estándar WASI-HTTP acabe satisfaciendo esta necesidad, pero, mientras tanto, ofrecemos un kit de desarrollo de software (SDK) para Rust y C. El SDK Unit-Wasm facilita la creación de aplicaciones web y API que se compilan en WebAssembly y se ejecutan en NGINX Unit. En nuestra guía práctica sobre WebAssembly, puede explorar el entorno de desarrollo y los pasos de compilación.

A pesar de nuestra visión y nuestro deseo de aprovechar el potencial de WebAssembly como entorno de ejecución universal, las aplicaciones creadas con este SDK solo se ejecutarán en NGINX Unit. Por este motivo, presentamos la compatibilidad con WebAssembly como una versión preliminar de la tecnología; esperamos sustituirla por la compatibilidad con WASI-HTTP en cuanto sea posible.

Prueba la versión preliminar de la tecnología

La versión preliminar de la tecnología tiene como objetivo mostrar el potencial de WebAssembly en el lado del servidor, a la vez que ofrece un servidor ligero para ejecutar aplicaciones web. Le animamos a probarla y experimentar con ella, y a enviarnos sus comentarios. Nos encantaría conocer su opinión a través de Slack de la comunidad de NGINX o del repositorio de NGINX Unit en GitHub.

Para empezar, instala NGINX Unit y consulta la guía práctica de WebAssembly


Compartir
Etiquetas: News, Tech, F5 NGINX, 2023

Sobre el autor

Liam Crilly
Liam CrillyDirector sénior de Gestión de Producto

Más artículos de Liam Crilly

Artículos relacionados del blog

Únete a F5 NGINX en AppWorld 2024
NGINX | 04/01/2024

Únete a F5 NGINX en AppWorld 2024

Descubre las numerosas razones para asistir al evento insignia de F5, que incluirá un emocionante anuncio sobre la cartera de productos NGINX.

Rotación de certificados SSL/TLS sin reinicios en NGINX Open Source
NGINX | 26/09/2023

Rotación de certificados SSL/TLS sin reinicios en NGINX Open Source

La función de diccionario compartido permite configurar NGINX sin necesidad de reiniciarlo al renovar los certificados SSL/TLS.

Exposición de APIs en Kubernetes
NGINX | 10/03/2022

Exposición de APIs en Kubernetes

La unidad 2 de Microservices March 2022 se centra en cómo exponer tus API en Kubernetes. Aquí tienes enlaces a los recursos que necesitas: la retransmisión en directo del 14 de marzo, artículos de blog y otros recursos de preparación, y el laboratorio práctico «Protege las API de Kubernetes mediante la limitación de solicitudes».

NGINX Sprint 2.0: visión clara, código renovado y nuevos compromisos con el código abierto
NGINX | 23/08/2021

NGINX Sprint 2.0: visión clara, código renovado y nuevos compromisos con el código abierto

Hoy, en NGINX Sprint 2.0, anunciamos cómo respaldaremos nuestra visión del futuro de las aplicaciones modernas con una mayor presencia en la comunidad de código abierto, incluida la participación en el proyecto comunitario Kubernetes, nuevos proyectos de software de código abierto y la arquitectura de referencia para aplicaciones modernas.

Presentamos NGINX Plus R22
NGINX | 09/06/2020

Presentamos NGINX Plus R22

NGINX Plus R22 incorpora nuevas funcionalidades, como la compatibilidad con OCSP para verificar la revocación de certificados en TLS mutuo, el uso de varios proveedores de identidad OIDC en una configuración, el seguimiento en tiempo real de la limitación de solicitudes y conexiones en el panel de NGINX Plus y mejoras en NGINX JavaScript.

Presentamos NGINX Plus R17
NGINX | 11/12/2018

Presentamos NGINX Plus R17

NGINX Plus R17 incorpora compatibilidad con la limitación de velocidad en dos fases y con TLS 1.3, la versión más reciente del protocolo Transport Layer Security. La configuración de OpenID Connect es más sencilla y NGINX ModSecurity WAF es el doble de rápido que antes. También se ha actualizado el módulo JavaScript de NGINX.