APISIX supports WASM plugins written with Proxy WASM SDK.
This plugin requires APISIX to run on APISIX-OpenResty, and is under construction. Currently, only a few APIs are implemented. Please follow wasm-nginx-module to know the progress.
The plugin supports the follwing concepts from Proxy WASM:
Wasm Virtual Machine ┌────────────────────────────────────────────────────────────────┐ │ Your Plugin │ │ │ │ │ │ 1: 1 │ │ │ 1: N │ │ VMContext ────────── PluginContext │ │ ╲ 1: N │ │ ╲ │ │ ╲ HttpContext │ │ (Http stream) │ └────────────────────────────────────────────────────────────────┘
First of all, we need to define the plugin in config.yaml
:
wasm: plugins: - name: wasm_log # the name of the plugin priority: 7999 # priority file: t/wasm/log/main.go.wasm # the path of `.wasm` file http_request_phase: access # default to "access", can be one of ["access", "rewrite"]
That's all. Now you can use the wasm plugin as a regular plugin.
For example, enable this plugin on the specified route:
curl -i http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "uri": "/index.html", "plugins": { "wasm_log": { "conf": "blahblah" } }, "upstream": { "type": "roundrobin", "nodes": { "127.0.0.1:1980": 1 } } }'
Attributes below can be configured in the plugin:
Name | Type | Requirement | Default | Valid | Description |
---|---|---|---|---|---|
conf | string | required | != "" | the plugin ctx configuration which can be fetched via Proxy WASM SDK |
Here is the mapping between Proxy WASM callbacks and APISIX's phases:
proxy_on_configure
: run once there is not PluginContext for the new configuration. For example, when the first request hits the route which has WASM plugin configured.proxy_on_http_request_headers
: run in the access/rewrite phase, depends on the configuration of http_request_phase
.proxy_on_http_response_headers
: run in the header_filter phase.