WebAssembly(简称Wasm)可为Web应用带来诸多优势。在浏览器中,它提供安全的沙盒执行环境,使前端开发者能够使用多种高级语言(不只是JavaScript!),同时不牺牲性能。在后端(服务器端),WebAssembly的跨平台支持和多架构可移植性有望让开发、部署和扩展比以往更加轻松。
NGINX期待这样的未来:只需创建一个服务器端WebAssembly模块,无需修改,也无需使用多个构建流水线,即可在任何环境中运行。WebAssembly模块可从本地开发环境一路运行到任务关键型多云环境。
随着NGINX Unit 1.31的发布,我们很高兴能将这一愿景变为现实。NGINX Unit是一款通用Web应用服务器,可在执行应用程序代码的同时处理TLS、静态文件和请求路由等其他基本功能。此外,NGINX Unit在实现上述功能的同时,还能为7种编程语言运行时以及现在新增的WebAssembly提供一致的开发者体验。
将WebAssembly添加到NGINX Unit具有多方面的意义:
- HTTP的请求-响应模式与WebAssembly沙箱的输入/输出(I/O)字节流天然契合。
- 开发者可以在不牺牲运行时性能的前提下,享受高级语言带来的高效开发体验。
- NGINX Unit的请求路由器可帮助使用多个WebAssembly模块构建复杂应用。
- WebAssembly启动速度快,既适合部署单个微服务和函数,也适合部署功能完备的应用。
- 通用可移植性和跨平台兼容性支持本地开发,无需复杂的构建流水线。
- NGINX Unit已提供应用级隔离,而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运行时提供。下图展示了HTTP请求从客户端发出、经过路由器,再到由Wasmtime执行的WebAssembly模块的流程。
在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 尚无此类标准。
我们预计,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操作指南
关于作者

相关博客文章
NGINX Plus R26 正式发布
NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。
使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。
Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。
NGINX Plus R19 正式发布
NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。
NGINX现已正式加入F5
NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。
