BLOG | NGINX

WebAssembly del lado del servidor con unidad NGINX

NGINX - Parte de F5 - horizontal, negro, tipo RGB
Miniatura de Liam Crilly
Liam Crilly
Publicado el 5 de septiembre de 2023

WebAssembly (abreviado como Wasm ) tiene mucho que ofrecer al mundo de las aplicações web. En el navegador, proporciona un entorno de ejecución seguro y protegido que permite a los desarrolladores frontend trabajar en una variedad de lenguajes de alto nivel (¡no solo JavaScript!) sin comprometer el rendimiento. Y en el backend (lado del servidor), el soporte multiplataforma y la portabilidad multiarquitectura de WebAssembly prometen hacer que el desarrollo, la implementación y la escalabilidad sean más fáciles que nunca.

En NGINX, imaginamos un mundo en el que puedes crear un módulo WebAssembly del lado del servidor y ejecutarlo en cualquier lugar, sin modificaciones y sin múltiples canales de compilación. En cambio, su módulo WebAssembly comenzaría en el desarrollo local y se ejecutaría hasta entornos multicloud de misión crítica.

Con el lanzamiento de NGINX Unit 1.31 , estamos entusiasmados de hacer realidad esta visión. NGINX Unit es un servidor de aplicaciones web universal donde se ejecuta el código de la aplicação junto con otros atributos esenciales de TLS, archivos estáticos y enrutamiento de solicitudes. Además, NGINX Unit hace todo esto mientras proporciona una experiencia de desarrollador consistente para siete entornos de ejecución de lenguajes de programación y ahora también WebAssembly.

Agregar WebAssembly a NGINX Unit tiene sentido en muchos niveles:

  • El patrón de solicitud-respuesta de HTTP se adapta naturalmente al flujo de bytes de entrada/salida (E/S) del entorno protegido de WebAssembly.
  • Los desarrolladores pueden disfrutar de una productividad de lenguaje de alto nivel sin comprometer el rendimiento en tiempo de ejecución.
  • El enrutador de solicitudes de NGINX Unit puede facilitar la construcción de aplicações complejas a partir de múltiples módulos WebAssembly.
  • El rápido tiempo de inicio de WebAssembly lo hace igualmente adecuado para implementar microservicios y funciones individuales o incluso aplicações con todas las funciones.
  • La portabilidad universal y la compatibilidad entre plataformas permiten el desarrollo local sin necesidad de procesos de compilación complejos.
  • NGINX Unit ya proporciona aislamiento por aplicación y el entorno protegido de WebAssembly hace que sea aún más seguro ejecutar código no confiable.

Nota : Al momento de escribir este artículo, el módulo WebAssembly es una versión preliminar de la tecnología (más detalles a continuación).

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

La arquitectura de la unidad NGINX desacopla los protocolos de red del tiempo de ejecución de la aplicação . El proceso del enrutador unitd: maneja la solicitud HTTP entrante y se encarga de la capa TLS según sea necesario. Después de decidir qué hacer con esta solicitud, el “contexto HTTP” (URI, encabezados y cuerpo) se pasa al entorno de ejecución de la aplicação .

Muchos lenguajes de programación tienen una especificación precisa sobre cómo el contexto HTTP se pone a disposición del código de la aplicação y cómo un desarrollador puede acceder a la URI, los encabezados 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 aplicação .

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 finalizada se envía de vuelta al enrutador para su transmisión al cliente.

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

Diagrama del flujo de una petición HTTP desde el cliente, a través del enrutador, al módulo WebAssembly ejecutado por Wasmtime.

Ejecución de módulos WebAssembly en la unidad NGINX

Configurar NGINX Unit para ejecutar un módulo WebAssembly es tan sencillo como para cualquier otro lenguaje. En el fragmento de configuración a continuación, hay una aplicação llamada helloworld con estos atributos:

  • El tipo define el módulo de idioma que se cargará para esta aplicação
  • El módulo apunta a un bytecode WebAssembly compilado
  • El acceso es una característica del entorno de ejecución de Wasmtime que permite que la aplicação acceda a recursos fuera del entorno limitado.
  • request_handler , malloc_handler y free_handler se relacionan con las funciones del SDK que transfieren el contexto HTTP a Wasmtime (más sobre esto en la siguiente sección)
{
"aplicações":{
"Hola Mundo":{
"tipo":"wasm",
"módulo":"/ruta/a/wasm_module.wasm",
"acceso":{
"sistema de archivos":[
"/tmp",
"/var/tmp"
]
},
"controlador_de_solicitudes": "controlador_de_solicitudes_luw",
"malloc_handler":"luw_malloc_handler",
"free_handler": "luw_free_handler"
}
}
}

Encontrar el contexto HTTP dentro del entorno de pruebas de WebAssembly

Como se mencionó 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. Si bien muchos entornos de ejecución de lenguajes de programación proporcionarían acceso directo y nativo a los metadatos HTTP, no existe un estándar similar para WebAssembly.

Esperamos que el estándar WASI-HTTP satisfaga 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 aplicações web y API que se compilan en WebAssembly y se ejecutan en NGINX Unit. En nuestra guía práctica para WebAssembly , puede explorar el entorno de desarrollo y los pasos de compilación.

A pesar de nuestra visión y deseo de aprovechar el potencial de WebAssembly como entorno de ejecución universal, las aplicações creadas con este SDK solo se ejecutarán en NGINX Unit. Es por esto que presentamos el soporte para WebAssembly como una vista previa de tecnología: esperamos reemplazarlo con soporte para WASI-HTTP tan pronto como sea posible.

Pruebe la vista previa de la tecnología

La vista previa de tecnología está aquí para mostrar el potencial de WebAssembly del lado del servidor y al mismo tiempo proporcionar un servidor liviano para ejecutar aplicações web. Por favor, aborde esto con una mentalidad de “probarlo todo”, experimente con ello y bríndenos su opinión. Nos encantaría saber de usted en el Slack de la comunidad NGINX o a través del repositorio de GitHub de NGINX Unit .

Para comenzar, instale NGINX Unit y vaya a la guía práctica de WebAssembly


"Esta publicación de blog puede hacer referencia a productos que ya no están disponibles o que ya no reciben soporte. Para obtener la información más actualizada sobre los productos y soluciones F5 NGINX disponibles, explore nuestra familia de productos NGINX . NGINX ahora es parte de F5. Todos los enlaces anteriores de NGINX.com redirigirán a contenido similar de NGINX en F5.com.