WASM 模块#

核心模块实现了 Angie 中的基本 WASM 功能: 这包括支持加载替代运行时和 WASM 模块, 以及配置它们的特性和限制。

本节中的其他模块扩展了此功能,使您能够 灵活配置和优化各种场景和需求的 WASM 特性。

在我们的代码库中,该模块构建为 动态, 并作为一个名为 angie-module-wasm 的独立包提供。

配置示例#

# 这些指令加载核心功能
load_module modules/ngx_wasm_module.so;
load_module modules/ngx_wasm_core_module.so;

load_module modules/ngx_wasmtime_module.so;

# 可在此处找到: https://git.angie.software/web-server/angie-wasm
load_module modules/ngx_http_wasm_host_module.so;
load_module modules/ngx_http_wasm_content_module.so;
load_module modules/ngx_http_wasm_vars_module.so;

events {

}

wasm_modules {

    #use wasmtime;

    load ngx_http_handler.wasm id=handler;
    load ngx_http_vars.wasm id=vars type=reactor;
}

http {

    wasm_var vars "ngx:wasi/var-utils#sum-entry" $rvar $arg_a $arg_b $arg_c $arg_d;

    server {

        listen *:8080;

        location / {

            return 200 "sum('$arg_a','$arg_b','$arg_c','$arg_d')=$rvar\n";
        }

        location /wasm {

            client_max_body_size 20M;
            wasm_content handler "ngx:wasi/http-handler-entry#handle-request";
        }
    }
}

指令#

load#

语法

load file id=id [fs=host_path:guest_path]... [api=api]... [type=command | reactor]

默认

上下文

wasm_modules

从磁盘 file 加载模块并为其分配一个 id (必需)。 在加载过程中,将验证模块以确保它可以实例化。

该指令具有以下参数:

fs

允许来宾访问主机上的目录。 可以为不同的目录多次指定。

api

为可用于模块的 API 启用白名单模式 并指定这些 API。 如果模块尝试使用受限 API(即未在此列出), 将返回“未找到 API”错误。

默认情况下,模块可以访问所有 API。

type

控制加载模块的生命周期。

  • command 模式下,机器运行一次 并在执行后销毁其状态。

  • 在 reactor 模式下,机器有效地无限期运行, 允许多次代码执行。 这需要仔细的内存管理: 如果未清理资源,可能会发生内存泄漏。

wasm_modules#

语法

wasm_modules { ... };

默认

上下文

main

一个顶级块指令 提供了配置文件上下文 在其中应指定 WASM 指令。 它可以包含加载 WASM 模块的指令 和配置运行时特定设置。