wasm-wasmtime: Nginx с поддержкой WebAssembly на базе wasmtime
Установка на Debian/Ubuntu
Эти документы относятся к APT пакету nginx-module-wasm-wasmtime, предоставляемому репозиторием GetPageSpeed Extras.
- Настройте репозиторий APT, как описано в настройке репозитория APT.
- Установите модуль:
sudo apt-get update
sudo apt-get install nginx-module-wasm-wasmtime
Warning
Этот модуль еще не опубликован как nginx-module-wasm-wasmtime в репозиториях APT. Следите за новостями или напишите на support@getpagespeed.com, чтобы запросить его.
WasmX/ngx_wasm_module
Nginx + WebAssembly
Этот модуль позволяет встраивать [WebAssembly] среды выполнения внутри Nginx и нацелен на предоставление нескольких абстракций SDK хоста с целью расширения и/или инспекции выполнения веб-сервера/прокси Nginx.
В настоящее время модуль реализует ABI хоста Proxy-Wasm, который позволяет использовать клиентские SDK, написанные на нескольких языках, таких как Rust и Go. Proxy-Wasm ("WebAssembly для прокси") является развивающимся стандартом для фильтров Wasm, принятым API шлюзами, такими как Kong и Envoy.
Что такое WasmX?
WasmX нацелен на расширение Nginx для современной веб-инфраструктуры. Это включает поддержку сред выполнения и SDK WebAssembly (с помощью ngx_wasm_module) и, в общем, увеличение широты функций, используемых в сценарии API шлюза (т.е. обратного проксирования). Смотрите CONTRIBUTING.md для получения дополнительной информации и дорожной карты.
Синопсис
## nginx.conf
events {}
## мастер-процесс nginx получает стандартный 'main' VM
## новый верхний конфигурационный блок получает всю конфигурацию для этого основного VM
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 для получения справки по поддержке Proxy-Wasm в ngx_wasm_module.
Для надежного ресурса в развивающейся спецификации 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
- API C для Wasm: https://github.com/WebAssembly/wasm-c-api
- API C для Wasmer: https://docs.rs/wasmer-c-api/
- API C для Wasmtime: https://docs.wasmtime.dev/c-api/
- Встраивание V8: https://v8.dev/docs/embed