wasm-wasmtime: Nginx con WebAssembly impulsado por wasmtime
Instalación
Puedes instalar este módulo en cualquier distribución basada en RHEL, incluyendo, pero no limitado a:
- RedHat Enterprise Linux 7, 8, 9 y 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 y Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-wasm-wasmtime
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-wasm-wasmtime
Habilita el módulo añadiendo lo siguiente en la parte superior de /etc/nginx/nginx.conf:
load_module modules/ngx_wasmx_module.so;
Este documento describe nginx-module-wasm-wasmtime v0.5.0 lanzado el 15 de febrero de 2025.
WasmX/ngx_wasm_module
Nginx + WebAssembly
Este módulo permite la integración de entornos de [WebAssembly] dentro de Nginx y tiene como objetivo ofrecer varias abstracciones de SDK de host con el propósito de extender y/o introspectar el tiempo de ejecución del servidor/proxy web Nginx.
Actualmente, el módulo implementa un ABI de host Proxy-Wasm, que permite el uso de SDKs de cliente escritos en múltiples lenguajes, como Rust y Go. Proxy-Wasm ("WebAssembly para Proxies") es un estándar emergente para filtros Wasm, adoptado por gateways de API como Kong y Envoy.
¿Qué es WasmX?
WasmX tiene como objetivo extender Nginx para la infraestructura moderna de la Web. Esto incluye el soporte para entornos y SDKs de WebAssembly (a través de ngx_wasm_module), y generalmente aumentar la amplitud de características en las que se basa el caso de uso de Gateway de API (es decir, proxy inverso). Consulta CONTRIBUTING.md para información adicional y detalles sobre la hoja de ruta.
Sinopsis
## nginx.conf
events {}
## el proceso maestro de nginx obtiene una VM 'main' por defecto
## un nuevo bloque de configuración de nivel superior recibe toda la configuración para esta VM principal
wasm {
# [nombre] [ruta.{wasm,wat}]
module my_filter /path/to/filter.wasm;
module my_module /path/to/module.wasm;
}
## cada proceso trabajador de nginx puede instanciar módulos wasm en sus subsistemas
http {
server {
listen 9000;
location / {
# ejecutar un filtro proxy-wasm al hacer proxy
# [módulo]
proxy_wasm my_filter;
# ejecutar más WebAssembly durante la fase de acceso
# [fase] [módulo] [función]
wasm_call access my_module check_something;
proxy_pass ...;
}
}
# otras directivas
wasm_socket_connect_timeout 60s;
wasm_socket_send_timeout 60s;
wasm_socket_read_timeout 60s;
wasm_socket_buffer_size 8k;
wasm_socket_large_buffers 32 16k;
}
Ejemplos
Varios "filtros de exhibición" son proporcionados como ejemplos por los autores de este módulo:
- proxy-wasm-rust-filter-echo: Un filtro httpbin/echo.
- proxy-wasm-rust-rate-limiting: Limitación de tasa inspirada en Kong Gateway en Rust.
- proxy-wasm-go-rate-limiting: Limitación de tasa inspirada en Kong Gateway en Go.
- proxy-wasm-assemblyscript-rate-limiting: Limitación de tasa inspirada en Kong Gateway en AssemblyScript.
Más ejemplos están disponibles para cada SDK de Proxy-Wasm:
Ten en cuenta que todos los ejemplos anteriores pueden no ser compatibles aún con ngx_wasm_module.
Por último, el WebAssembly Hub contiene muchos otros filtros Proxy-Wasm, algunos de los cuales pueden no ser compatibles aún con ngx_wasm_module.
Documentación
Uso
Consulta la documentación del usuario para recursos sobre el uso de este módulo.
Desarrollo
Consulta la documentación para desarrolladores para recursos para desarrolladores sobre la construcción de este módulo desde el código fuente y otros procesos de desarrollo generales.
¿Ves un término con el que no estás familiarizado? Consulta el léxico de código.
Para una introducción sobre la disposición y arquitectura del código, consulta la sección de disposición del código.
Proxy-Wasm SDK
El Proxy-Wasm SDK es el enfoque inicial del desarrollo de WasmX/ngx_wasm_module y todavía está en progreso. Puedes navegar por PROXY_WASM.md para una guía sobre el soporte de Proxy-Wasm en ngx_wasm_module.
Para un recurso confiable en una especificación ABI en evolución, también puedes consultar el código fuente del SDK del lenguaje de tu elección en la lista de SDKs de Proxy-Wasm.
WebAssembly
- Especificación de WebAssembly (Wasm): https://webassembly.github.io/spec/core/index.html
- Interfaz del sistema WebAssembly (WASI): https://github.com/WebAssembly/WASI
- Formato de texto de WebAssembly (
.wat): https://developer.mozilla.org/en-US/docs/WebAssembly/Understanding_the_text_format
Entornos de WebAssembly
- API de C de Wasm: https://github.com/WebAssembly/wasm-c-api
- API de C de Wasmer: https://docs.rs/wasmer-c-api/
- API de C de Wasmtime: https://docs.wasmtime.dev/c-api/
- Embedding de V8: https://v8.dev/docs/embed
GitHub
Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-wasm-wasmtime.