使用NGINX Unit实现服务器端WebAssembly

NGINX | 2023年9月05日

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模块的流程。

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操作指南


分享
标签: News, Tech, F5 NGINX, 2023

关于作者

相关博客文章

NGINX Plus R26 正式发布
NGINX | 2022/02/15

NGINX Plus R26 正式发布

NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
NGINX | 2022/02/10

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击

gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
NGINX | 2021/09/13

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划

了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。

NGINX Plus R19 正式发布
NGINX | 2019/09/03

NGINX Plus R19 正式发布

NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。

NGINX现已正式加入F5
NGINX | 2019/05/09

NGINX现已正式加入F5

NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。

使用NGINX和NGINX Plus实现高性能缓存
NGINX | 2016/08/24

使用NGINX和NGINX Plus实现高性能缓存

我将介绍NGINX在内容缓存和性能方面的工作原理,并分享一些控制NGINX内容缓存方式的技巧。