NGINX.COM

WebAssembly(缩写为 Wasm)可为 Web 应用领域提供有力支持。在浏览器中,它提供了一个安全的沙盒执行环境,支持前端开发人员在不影响性能的情况下使用各种高级语言(不仅限于 JavaScript!)。在后端(服务器端),WebAssembly 的跨平台支持和多架构可移植性有望极大地简化开发、部署和可扩展性。

NGINX 旨在帮助您创建服务器端 WebAssembly 模块并在任何位置运行它 — 不必修改也无需多个 build 流水线。相反,您的 WebAssembly 模块创建可以从本地开发开始,直至投入到运行任务关键的多云环境。

随着 NGINX Unit 1.31 的发布,我们很高兴实现了这一愿景。NGINX Unit 是一个通用的 web 应用服务器,应用代码与 TLS、静态文件及请求路由等其他基本属性一同执行。不仅如此,NGINX Unit 还面向七种编程语言运行时提供一致的开发人员体验,现在又添加了 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 请求流。

从客户端到路由器再到由 Wasmtime 执行的 WebAssembly 模块的 HTTP 请求流程图

在 NGINX Unit 上运行 WebAssembly 模块

配置 NGINX Unit 来运行 WebAssembly 模块就像使用其他任何语言一样简单。下面的配置片段中有一个名为 helloworld 的应用,它具有以下属性:

  • type 定义要为此应用加载的语言模块
  • module 指向已编译的 WebAssembly 字节码
  • access 是 Wasmtime 运行时的一项特性,支持应用访问沙盒以外的资源
  • request_handlermalloc_handlerfree_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 支持轻松编写 Web 应用和 API,这些应用和 API 可编译为 WebAssembly,并在 NGINX Unit 上运行。请查看我们的 WebAssembly 操作指南,了解开发环境和构建步骤。

尽管我们希望实现 WebAssembly 作为通用运行时的潜力,但使用该 SDK 构建的应用只能在 NGINX Unit 上运行。因此,我们将 WebAssembly 支持作为技术预览版推出,希望尽快代之以 WASI-HTTP 支持。

 

试用技术预览版

技术预览版旨在展示服务器端 WebAssembly 的潜力,同时为运行 Web 应用提供轻量级服务器。欢迎试用,并提出反馈意见。请在 NGINX Community Slack 上或通过 NGINX Unit GitHub repo 告诉我们。

在开始使用之前,请安装 NGINX Unit 并查看 WebAssembly 操作指南

Hero image
《NGINX 完全指南》2024 年最新完整版


高性能负载均衡的进阶使用指南

关于作者

Liam Crilly

产品管理高级总监

关于 F5 NGINX

F5, Inc. 是备受欢迎的开源软件 NGINX 背后的商业公司。我们为现代应用的开发和交付提供一整套技术。我们的联合解决方案弥合了 NetOps 和 DevOps 之间的横沟,提供从代码到用户的多云应用服务。访问 nginx-cn.net 了解更多相关信息。