点赞
评论
收藏
分享
举报
借助 NGINX Unit 在服务器端使用 WebAssembly
发表于2024-06-12 18:15

浏览 3.3k

原文作者:Liam Crilly - F5 产品管理高级总监
原文链接:借助 NGINX Unit 在服务器端使用 WebAssembly
转载来源:NGINX 中文官网

NGINX 唯一中文官方社区 ,尽在 nginx.org.cn



 

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 请求流。

 

 

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

 


 

NGINX 唯一中文官方社区 ,尽在 nginx.org.cn

更多 NGINX 相关的技术干货、互动问答、系列课程、活动资源: 开源社区官网 | 微信公众号 | B 站

已修改于2024-06-12 18:15
本作品系原创
创作不易,留下一份鼓励
NGINX官方账号

暂无个人介绍

关注



写下您的评论
发表评论
全部评论(0)

按点赞数排序

按时间排序

关于作者
NGINX官方账号
这家伙很懒还未留下介绍~
331
文章
21
问答
201
粉丝
相关文章
介绍NGINXUnit是一个多语言动态应用服务器,同样支持代理和静态文件。是由NGINX作者IgorSysoev亲自设计带领团队从零实现的高性能纯C服务器。Unit的使用对开发者和运维非常友好。 关键特性:灵活用HTTP协议的RESTfulJSONAPI更新任意粒度配置极其强大和易用的路由管理请求支持所有主流语言:GO,Python,JAVA,Perl,PHP,NodeJS,Ruby支持负载均衡的代理支持静态资源服务 性能高并发:使用异步事件处理模型低内存:使用连接和内存复用每个应用语言的进程管理支持动态和静态分配对Java,Perl,Python,Ruby支持原生多线程处理 安全和稳定性处理请求的进程以非特权方式运行进程间完全独立不同的应用完全相互隔离支持用容器化方式对应用程序进行namespace和filesystem隔离支持SSL/TLS 社区和文档容易上手保持一直活跃的开发状态:https://github.com/nginx/unit/官方一直更新使用文档:https://unit.nginx.org/ 完整示例:{ "cer
点赞 7
浏览 9.1k
感谢您参加> Ø3月11日用Unit实现应用的动态配置Ø 3月18日Unit的负载均衡配置Ø 3月25日Unit架构设计Ø 4月01日Unit源代码解读
点赞 1
浏览 8k
Unit,已经出道好几年Unit是NGINX作者IgorSysoev亲自设计,NGINX团队核心人员开发的,首次开源发布于2017年。有着活跃的社区和专业的开发能力,我有幸成为其中正式一员。Changes with Unit 1.24.0   27 May 2021......Changes with Unit 0.1      06 Sep 2017*)Firstpublicrelease.Unit现代应用服务器软件结合此图看Unit,以下是它的核心功能。配置:完全动态,包括进程数、服务监听端口、证书等。路由:灵活并且强大的路由功能,它会成为微服务的杀器功能。语言:支持各种主流语言和版本,这对DevOps太友好了。文件:支持静态资源服务,并且更好用。代理:目前只有简单的轮循,成为完整的负载均衡只是时间问题。容器:目前拥有隔离功能,一直在挑战做容器的事情。NGINX,全球头号Web
点赞 0
浏览 7.7k