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 模块和配置特定运行时设置的指令。