WebAssembly (abreviado para Wasm ) tem muito a oferecer ao mundo dos aplicativos web. No navegador, ele fornece um ambiente de execução seguro e em sandbox que permite que desenvolvedores front-end trabalhem em uma variedade de linguagens de alto nível (não apenas JavaScript!) sem comprometer o desempenho. E no backend (lado do servidor), o suporte multiplataforma e a portabilidade multiarquitetura do WebAssembly prometem tornar o desenvolvimento, a implantação e a escalabilidade mais fáceis do que nunca.
Na NGINX, imaginamos um mundo onde você pode criar um módulo WebAssembly do lado do servidor e executá-lo em qualquer lugar – sem modificação e sem múltiplos pipelines de construção. Em vez disso, seu módulo WebAssembly começaria no desenvolvimento local e seria executado até ambientes multinuvem de missão crítica.
Com o lançamento do NGINX Unidade 1.31 , estamos animados para concretizar essa visão. O NGINX Unit é um servidor de aplicativo web universal onde o código do aplicativo é executado juntamente com outros atributos essenciais de TLS, arquivos estáticos e roteamento de solicitações. Além disso, o NGINX Unit faz tudo isso enquanto fornece uma experiência de desenvolvedor consistente para sete tempos de execução de linguagem de programação e agora também para WebAssembly.
Adicionar WebAssembly ao NGINX Unit faz sentido em muitos níveis:
Observação : No momento em que este artigo foi escrito, o módulo WebAssembly era uma prévia de tecnologia – mais detalhes abaixo.
A arquitetura da unidade NGINX desacopla os protocolos de rede do tempo de execução do aplicativo. O processo unitd: router
manipula a solicitação HTTP de entrada, cuidando da camada TLS conforme necessário. Depois de decidir o que fazer com essa solicitação, o “contexto HTTP” (URI, cabeçalhos e corpo) é então passado para o tempo de execução do aplicativo.
Muitas linguagens de programação têm uma especificação precisa de como o contexto HTTP é disponibilizado para o código do aplicativo e como um desenvolvedor pode acessar URI, cabeçalhos e corpo. A Unidade NGINX fornece vários módulos de linguagem que implementam uma camada de interface entre o roteador da Unidade NGINX e o tempo de execução do aplicativo.
O módulo de linguagem WebAssembly para NGINX Unit fornece uma camada de interface semelhante entre o tempo de execução do WebAssembly e o processo do roteador. A memória linear do sandbox do WebAssembly é inicializada com o contexto HTTP da solicitação atual e a resposta finalizada é enviada de volta ao roteador para transmissão ao cliente.
O ambiente de execução em sandbox é fornecido pelo tempo de execução Wasmtime . O diagrama abaixo ilustra o fluxo de uma solicitação HTTP do cliente, através do roteador, até o módulo WebAssembly executado pelo Wasmtime.
Configurar o NGINX Unit para executar um módulo WebAssembly é tão simples quanto configurar qualquer outra linguagem. No snippet de configuração abaixo, há um aplicativo chamado helloworld
com estes atributos:
tipo
define o módulo de linguagem a ser carregado para esta aplicaçãomódulo
aponta para um bytecode WebAssembly compiladoacesso
é um recurso do tempo de execução do Wasmtime que permite que o aplicativo acesse recursos fora do sandboxrequest_handler
, malloc_handler
e free_handler
se relacionam com as funções do SDK que transferem o contexto HTTP para o Wasmtime (mais sobre isso na próxima seção){
"aplicativos":{
"helloworld":{
"tipo":"wasm",
"módulo":"/caminho/para/wasm_module.wasm",
"acesso":{
"sistema de arquivos":[
"/tmp",
"/var/tmp"
]
},
"manipulador_de_solicitação":"luw_manipulador_de_solicitação",
"manipulador_malloc":"luw_manipulador_malloc",
"manipulador_livre":"luw_manipulador_livre"
}
}
}
Conforme mencionado acima, o módulo de linguagem WebAssembly da Unidade NGINX inicializa o sandbox de execução do WebAssembly com o contexto HTTP da solicitação atual. Enquanto muitos tempos de execução de linguagens de programação forneceriam acesso nativo e direto aos metadados HTTP, não existe tal padrão para o WebAssembly.
Esperamos que o padrão WASI-HTTP satisfaça essa necessidade, mas, enquanto isso, fornecemos um kit de desenvolvimento de software (SDK) para Rust e C. O Unit-Wasm SDK facilita a escrita de aplicativos da web e APIs que são compilados para WebAssembly e executados no NGINX Unit. Em nosso guia prático para WebAssembly , você pode explorar o ambiente de desenvolvimento e as etapas de compilação.
Apesar da nossa visão e desejo de concretizar o potencial do WebAssembly como um tempo de execução universal, os aplicativos criados com este SDK só serão executados no NGINX Unit. É por isso que apresentamos o suporte ao WebAssembly como uma prévia de tecnologia – esperamos substituí-lo pelo suporte a WASI-HTTP assim que possível.
O Technology Preview está aqui para mostrar o potencial do WebAssembly do lado do servidor, ao mesmo tempo em que fornece um servidor leve para executar aplicativos da web. Por favor, aborde-o com uma mentalidade de “testar” – experimente e nos dê seu feedback. Gostaríamos de ouvir de você no Slack da Comunidade NGINX ou por meio do repositório GitHub da Unidade NGINX .
Para começar, instale o NGINX Unit e vá para o guia prático do WebAssembly
"Esta postagem do blog pode fazer referência a produtos que não estão mais disponíveis e/ou não têm mais suporte. Para obter as informações mais atualizadas sobre os produtos e soluções F5 NGINX disponíveis, explore nossa família de produtos NGINX . O NGINX agora faz parte do F5. Todos os links anteriores do NGINX.com redirecionarão para conteúdo semelhante do NGINX no F5.com."