wasm-wasmtime: 基于 wasmtime 的 Nginx WebAssembly
安装
您可以在任何基于 RHEL 的发行版中安装此模块,包括但不限于:
- RedHat Enterprise Linux 7、8、9 和 10
- CentOS 7、8、9
- AlmaLinux 8、9
- Rocky Linux 8、9
- Amazon Linux 2 和 Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-wasm-wasmtime
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-wasm-wasmtime
通过在 /etc/nginx/nginx.conf 的顶部添加以下内容来启用模块:
load_module modules/ngx_wasmx_module.so;
本文档描述了 nginx-module-wasm-wasmtime v0.5.0,于 2025 年 2 月 15 日发布。
WasmX/ngx_wasm_module
Nginx + WebAssembly
此模块使得可以在 Nginx 内嵌入 [WebAssembly] 运行时,并旨在提供多个主机 SDK 抽象,以扩展和/或检查 Nginx Web 服务器/代理运行时。
目前,该模块实现了 Proxy-Wasm 主机 ABI,允许使用用多种语言编写的客户端 SDK,例如 Rust 和 Go。Proxy-Wasm(“代理的 WebAssembly”)是一个新兴标准,用于 Wasm 过滤器,被 API 网关如 Kong 和 Envoy 采用。
什么是 WasmX?
WasmX 旨在扩展 Nginx 以适应现代 Web 基础设施。这包括支持 WebAssembly 运行时和 SDK(通过 ngx_wasm_module),并普遍增加 API 网关用例(即反向代理)所依赖的功能范围。有关更多背景和路线图信息,请参见 CONTRIBUTING.md。
概述
## nginx.conf
events {}
## nginx 主进程获取默认的 'main' 虚拟机
## 一个新的顶级配置块接收此主虚拟机的所有配置
wasm {
# [name] [path.{wasm,wat}]
module my_filter /path/to/filter.wasm;
module my_module /path/to/module.wasm;
}
## 每个 nginx 工作进程能够在其子系统中实例化 wasm 模块
http {
server {
listen 9000;
location / {
# 在代理时执行 proxy-wasm 过滤器
# [module]
proxy_wasm my_filter;
# 在访问阶段执行更多 WebAssembly
# [phase] [module] [function]
wasm_call access my_module check_something;
proxy_pass ...;
}
}
# 其他指令
wasm_socket_connect_timeout 60s;
wasm_socket_send_timeout 60s;
wasm_socket_read_timeout 60s;
wasm_socket_buffer_size 8k;
wasm_socket_large_buffers 32 16k;
}
示例
模块的作者提供了几个“展示过滤器”作为示例:
- proxy-wasm-rust-filter-echo: 一个 httpbin/echo 过滤器。
- proxy-wasm-rust-rate-limiting: 受 Kong Gateway 启发的 Rust 限流。
- proxy-wasm-go-rate-limiting: 受 Kong Gateway 启发的 Go 限流。
- proxy-wasm-assemblyscript-rate-limiting: 受 Kong Gateway 启发的 AssemblyScript 限流。
每个 Proxy-Wasm SDK 还有更多示例:
请注意,以上所有示例可能尚不兼容 ngx_wasm_module。
最后但同样重要的是,WebAssembly Hub 包含许多其他 Proxy-Wasm 过滤器,其中一些可能尚不兼容 ngx_wasm_module。
文档
使用
有关此模块使用的资源,请参见 用户文档。
开发
有关从源代码构建此模块和其他一般开发流程的开发者资源,请参见 开发者文档。
看到不熟悉的术语?请查阅 代码 词汇表。
有关代码布局和架构的简介,请参见 代码 布局 部分。
Proxy-Wasm SDK
Proxy-Wasm SDK 是 WasmX/ngx_wasm_module 开发的初始重点,仍在进行中。您可以浏览 PROXY_WASM.md 以获取有关 ngx_wasm_module 中 Proxy-Wasm 支持的指南。
对于不断发展的 ABI 规范中的可靠资源,您可能还希望查阅您选择的语言的 SDK 源代码,见 Proxy-Wasm SDKs 列表。
WebAssembly
- WebAssembly 规范 (Wasm): https://webassembly.github.io/spec/core/index.html
- WebAssembly 系统接口 (WASI): https://github.com/WebAssembly/WASI
- WebAssembly 文本格式 (
.wat): https://developer.mozilla.org/en-US/docs/WebAssembly/Understanding_the_text_format
WebAssembly 运行时
- Wasm C API: https://github.com/WebAssembly/wasm-c-api
- Wasmer C API: https://docs.rs/wasmer-c-api/
- Wasmtime C API: https://docs.wasmtime.dev/c-api/
- V8 嵌入: https://v8.dev/docs/embed
GitHub
您可以在 nginx-module-wasm-wasmtime 的 GitHub 仓库 中找到此模块的更多配置提示和文档。