wasm-wasmtime: Nginx com WebAssembly alimentado por wasmtime
Instalação
Você pode instalar este módulo em qualquer distribuição baseada em RHEL, incluindo, mas não se limitando a:
- RedHat Enterprise Linux 7, 8, 9 e 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 e 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
Ative o módulo adicionando o seguinte no topo de /etc/nginx/nginx.conf:
load_module modules/ngx_wasmx_module.so;
Este documento descreve o nginx-module-wasm-wasmtime v0.5.0 lançado em 15 de fevereiro de 2025.
WasmX/ngx_wasm_module
Nginx + WebAssembly
Este módulo permite a incorporação de runtimes de [WebAssembly] dentro do Nginx e tem como objetivo oferecer várias abstrações de SDK de host para o propósito de estender e/ou introspectar o runtime do servidor/proxy web Nginx.
Atualmente, o módulo implementa uma ABI de host Proxy-Wasm, que permite o uso de SDKs de cliente escritos em várias linguagens, como Rust e Go. Proxy-Wasm ("WebAssembly para Proxies") é um padrão emergente para filtros Wasm, adotado por Gateways de API como Kong e Envoy.
O que é WasmX?
WasmX tem como objetivo estender o Nginx para a infraestrutura moderna da Web. Isso inclui o suporte a runtimes e SDKs de WebAssembly (por meio do ngx_wasm_module) e, de modo geral, aumentar a gama de recursos utilizados pelo caso de uso do Gateway de API (ou seja, reverse-proxying). Consulte CONTRIBUTING.md para informações adicionais sobre o contexto e o roadmap.
Sinopse
## nginx.conf
events {}
## o processo mestre do nginx obtém uma VM 'main' padrão
## um novo bloco de configuração de nível superior recebe toda a configuração para esta VM principal
wasm {
# [nome] [caminho.{wasm,wat}]
module my_filter /path/to/filter.wasm;
module my_module /path/to/module.wasm;
}
## cada processo worker do nginx é capaz de instanciar módulos wasm em seus subsistemas
http {
server {
listen 9000;
location / {
# execute um filtro proxy-wasm ao fazer proxy
# [módulo]
proxy_wasm my_filter;
# execute mais WebAssembly durante a fase de acesso
# [fase] [módulo] [função]
wasm_call access my_module check_something;
proxy_pass ...;
}
}
# outras diretivas
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;
}
Exemplos
Vários "filtros de vitrine" são fornecidos como exemplos pelos autores deste módulo:
- proxy-wasm-rust-filter-echo: Um filtro httpbin/echo.
- proxy-wasm-rust-rate-limiting: Limitação de taxa inspirada no Kong Gateway em Rust.
- proxy-wasm-go-rate-limiting: Limitação de taxa inspirada no Kong Gateway em Go.
- proxy-wasm-assemblyscript-rate-limiting: Limitação de taxa inspirada no Kong Gateway em AssemblyScript.
Mais exemplos estão disponíveis para cada SDK Proxy-Wasm:
Observe que todos os exemplos acima podem não ser compatíveis com ngx_wasm_module.
Por último, mas não menos importante, o WebAssembly Hub contém muitos outros filtros Proxy-Wasm, alguns dos quais podem não ser compatíveis com ngx_wasm_module.
Documentação
Uso
Consulte a documentação do usuário para recursos sobre o uso deste módulo.
Desenvolvimento
Consulte a documentação do desenvolvedor para recursos para desenvolvedores sobre como construir este módulo a partir do código-fonte e outros processos gerais de desenvolvimento.
Viu um termo com o qual você não está familiarizado? Consulte o léxico de código.
Para uma introdução sobre o layout e a arquitetura do código, veja a seção layout do código.
Proxy-Wasm SDK
O Proxy-Wasm SDK é o foco inicial do desenvolvimento do WasmX/ngx_wasm_module e ainda está em andamento. Você pode navegar por PROXY_WASM.md para um guia sobre o suporte ao Proxy-Wasm no ngx_wasm_module.
Para um recurso confiável em uma especificação ABI em evolução, você também pode consultar o código-fonte do SDK da linguagem de sua escolha na lista de SDKs Proxy-Wasm.
WebAssembly
- Especificação WebAssembly (Wasm): https://webassembly.github.io/spec/core/index.html
- Interface de Sistema WebAssembly (WASI): https://github.com/WebAssembly/WASI
- Formato de texto WebAssembly (
.wat): https://developer.mozilla.org/en-US/docs/WebAssembly/Understanding_the_text_format
Runtimes WebAssembly
- API C Wasm: https://github.com/WebAssembly/wasm-c-api
- API C Wasmer: https://docs.rs/wasmer-c-api/
- API C Wasmtime: https://docs.wasmtime.dev/c-api/
- Embedding V8: https://v8.dev/docs/embed
GitHub
Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório do GitHub para nginx-module-wasm-wasmtime.