原文作者:Liam Crilly of F5
原文链接:借助 NGINX Unit 在服务器端使用 WebAssembly
转载来源:NGINX 中文官网
NGINX 唯一中文官方社区 ,尽在 nginx.org.cn
WebAssembly (缩写为 Wasm )可为 Web 应用领域提供有力支持。在浏览器中,它提供了一个安全的沙盒执行环境,支持前端开发人员在不影响性能的情况下使用各种高级语言(不仅限于 JavaScript!)。在后端(服务器端),WebAssembly 的跨平台支持和多架构可移植性有望极大地简化开发、部署和可扩展性。
NGINX 旨在帮助您创建服务器端 WebAssembly 模块并在任何位置运行它 — 不必修改也无需多个 build 流水线。相反,您的 WebAssembly 模块创建可以从本地开发开始,直至投入到运行任务关键的多云环境。
将 WebAssembly 添加到 NGINX Unit 在多个层面上都很有必要:
-
HTTP 的“请求-响应”模式与 WebAssembly 沙盒的输入/输出(I/O)字节流完美契合。
-
开发人员能够在不影响运行时性能的情况下尽享高级语言生产效率。
-
NGINX Unit 的请求路由器可帮助通过多个 WebAssembly 模块构建复杂应用。
-
WebAssembly 的启动速度很快,因此同样适用于部署单个微服务和功能,乃至功能齐全的应用。
-
通用可移植性和跨平台兼容性有助于本地开发,而没有复杂的 build 流水线。
-
NGINX Unit 已经提供了 Per-App 隔离,WebAssembly 沙盒有助于更安全地运行不受信任的代码。
注 :截至本文撰写时,WebAssembly 模块为技术预览版 — 详情见下。
NGINX Unit WebAssembly 模块的工作原理
NGINX Unit 的架构将网络协议从应用运行时中分离出来。 unitd: router 进程会处理传入的 HTTP 请求,并根据需要处理 TLS 层。在确定如何处理该请求后,“HTTP 上下文”(URI、请求头和正文)将被传递到应用运行时。
对于如何向应用代码提供 HTTP 上下文以及开发人员如何访问 URI、请求头和正文,许多编程语言都有明确的规范。NGINX Unit 提供了多个语言模块,可实现 NGINX Unit 路由器与应用运行时之间的接口层。
NGINX Unit 的 WebAssembly 语言模块在 WebAssembly 运行时和路由器进程之间提供了类似的接口层。WebAssembly 沙盒的 线性内存 使用当前请求的 HTTP 上下文进行初始化,最终的响应将返回到路由器,以便传输给客户端。
沙盒执行环境由 Wasmtime 运行时提供。下图说明了从客户端到路由器再到由 Wasmtime 执行的 WebAssembly 模块的 HTTP 请求流。
在 NGINX Unit 上运行 WebAssembly 模块
配置 NGINX Unit 来运行 WebAssembly 模块就像使用其他任何语言一样简单。下面的配置片段中有一个名为 helloworld 的应用,它具有以下属性:
-
type 定义要为此应用加载的语言模块
-
module 指向已编译的 WebAssembly 字节码
-
access 是 Wasmtime 运行时的一项特性,支持应用访问沙盒以外的资源
-
request_handler 、 malloc_handler 和 free_handler 与将 HTTP 上下文传输到 Wasmtime 的 SDK 函数有关(下一节将详细介绍)
{
"applications":{
"helloworld":{
"type":"wasm",
"module":"/path/to/wasm_module.wasm",
"access":{
"filesystem":[
"/tmp",
"/var/tmp"
]
},
"request_handler":"luw_request_handler",
"malloc_handler":"luw_malloc_handler",
"free_handler":"luw_free_handler"
}
}
}
在 WebAssembly 沙盒中查找 HTTP 上下文
如上所述,NGINX Unit 的 WebAssembly 语言模块使用当前请求的 HTTP 上下文初始化 WebAssembly 执行沙盒。许多编程语言运行时都能提供对 HTTP 元数据的原生直接访问,而 WebAssembly 没有此类标准。
尽管我们希望实现 WebAssembly 作为通用运行时的潜力,但使用该 SDK 构建的应用只能在 NGINX Unit 上运行。因此,我们将 WebAssembly 支持作为技术预览版推出,希望尽快代之以 WASI-HTTP 支持。
试用技术预览版
NGINX 唯一中文官方社区 ,尽在 nginx.org.cn
更多 NGINX 相关的技术干货、互动问答、系列课程、活动资源: 开源社区官网 | 微信公众号