WebAssembly (缩写为Wasm )为 Web应用世界提供了许多帮助。 在浏览器中,它提供了一个安全的沙盒执行环境,使前端开发人员能够使用各种高级语言(不仅仅是 JavaScript!)工作,而不会影响性能。 在后端(服务器端),WebAssembly 的跨平台支持和多架构可移植性有望使开发、部署和可扩展性比以往更容易。
在 NGINX,我们设想这样一个世界,您可以创建服务器端 WebAssembly 模块并在任何地方运行它——无需修改,也无需多个构建管道。 相反,您的 WebAssembly 模块将从本地开发开始,一直运行到关键任务、多云环境。
随着NGINX Unit 1.31 的发布,我们很高兴能够实现这一愿景。 NGINX Unit 是一个通用的 Web 应用服务器,其中应用代码与 TLS、静态文件和请求路由的其他基本属性一起执行。 此外,NGINX Unit 在完成所有这些工作的同时,还为七种编程语言运行时以及现在的 WebAssembly 提供了一致的开发人员体验。
将 WebAssembly 添加到 NGINX Unit 在多个层面上都是有意义的:
笔记: 在撰写本文时,WebAssembly 模块是一个技术预览版 —— 更多详细信息请参见下文。
NGINX Unit 的架构将网络协议与应用运行时分离。 unitd:路由器
进程处理传入的 HTTP 请求,并根据需要处理 TLS 层。 在决定如何处理此请求之后,“HTTP 上下文”(URI、标头和正文)将传递给应用运行时。
许多编程语言对于如何向应用代码提供 HTTP 上下文,以及开发人员如何访问 URI、标头和正文都有精确的规范。 NGINX Unit 提供了几种语言模块,实现了 NGINX Unit 的路由器和应用运行时之间的接口层。
NGINX Unit 的 WebAssembly 语言模块在 WebAssembly 运行时和路由器进程之间提供了类似的接口层。 WebAssembly 沙盒的线性内存使用当前请求的 HTTP 上下文进行初始化,并将最终确定的响应发送回路由器以传输到客户端。
沙盒执行环境由Wasmtime运行时提供。 下图说明了 HTTP 请求从客户端、通过路由器到 Wasmtime 执行的 WebAssembly 模块的流程。
配置 NGINX Unit 来执行 WebAssembly 模块与配置任何其他语言一样简单。 在下面的配置片段中,有一个名为helloworld
的应用具有以下属性:
类型
定义要为该应用加载的语言模块模块
指向已编译的 WebAssembly 字节码access
是 Wasmtime 运行时的一项功能,使应用能够访问沙盒之外的资源request_handler
、 malloc_handler
和free_handler
与将 HTTP 上下文传输到 Wasmtime 的 SDK 函数相关(下一节将详细介绍){
“应用”:{
“你好世界”:{
“类型”:“wasm”,
“模块”:“/path/to/wasm_module.wasm”,
“使用权”:{
“文件系统”:[
“/tmp”
“/var/tmp”
]
},
“request_handler”:“luw_request_handler”,
"malloc_handler":"luw_malloc_handler",
"free_handler":"luw_free_handler"
}
}
}
如上所述,NGINX Unit 的 WebAssembly 语言模块使用当前请求的 HTTP 上下文初始化 WebAssembly 执行沙箱。 许多编程语言运行时都会提供对 HTTP 元数据的本机、直接访问,但 WebAssembly 并不存在这样的标准。
我们希望WASI-HTTP标准最终能够满足这一需求,但与此同时,我们为 Rust 和 C 提供了一个软件开发工具包 (SDK) 。Unit-Wasm SDK 可以轻松编写编译为 WebAssembly 并在 NGINX Unit 上运行的 Web应用和 API。 在我们的WebAssembly 操作指南中,您可以探索开发环境和构建步骤。
尽管我们的愿景和愿望是实现 WebAssembly 作为通用运行时的潜力,但使用此 SDK 构建的应用只能在 NGINX Unit 上运行。 这就是我们引入 WebAssembly 支持作为技术预览的原因——我们希望尽快用 WASI-HTTP 支持取代它。
该技术预览版旨在展示服务器端 WebAssembly 的潜力,同时提供一个用于运行 Web应用的轻量级服务器。 请以“尝试一下”的心态来对待它 - 进行试验并向我们提供反馈。 我们很乐意通过NGINX Community Slack或NGINX Unit GitHub repo听到您的声音。
首先,安装NGINX Unit并跳转到WebAssembly 的操作指南
“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”