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:
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).
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.
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çãoEl módulo
apunta a un bytecode WebAssembly compiladoEl 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"
}
}
}
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.
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.