# OpenNJet-WASM **Repository Path**: njet-rd/open-njet-wasm ## Basic Information - **Project Name**: OpenNJet-WASM - **Description**: 该程序是 OpenNJet 的 wasm 插件程序,支持动态引入 OpenNJet 程序中,通过使用 wasm 程序处理 http 请求。 - **Primary Language**: C - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 34 - **Forks**: 1 - **Created**: 2024-10-25 - **Last Updated**: 2024-11-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README njet WASM repo === 目录结构介绍 === ``` ├── njet-3.1.0-wasm.diff - 基于OpenNJet v3.1.0版本 wasm patch ├── njet.conf - OpenNjet 加载wasm 配置 ├── wasm-runtime - wasm编译工具链 ├── my-wasm - 自定义wasm模块模板 ├── wasm-baselib - host api基础库编译目录 ├── README.md - readme文件 └── wasm - patch以及基础库完整编译目录 ├── libngxhost - host api基础库源码目录 ├── ngx-http-vars - HTTP 变量求和计算模块 ├── ngx-http-handler - http 请求处理模块 └── vendor - WASI module ``` === wasm功能特性 === ``` 读取njet变量 设置变量到njet 读取请求request header 设置响应response header 读取请求request body 设置响应response body 异步处理http请求 njet写日志接口 ``` ``` 默认提供 wasmer runtime 运行时环境 ``` ``` 提供两个 wasm 示例模块 njt_http_handler: 获取HTTP请求(header/body),设置HTTP响应(header/body) the module allows to use wasm code to implement HTTP request content handler njt_http_vars: HTTP arg变量求和 the module allows to use wasm code to define HTTP request variables ``` === 源码编译环境 === 由于使用编译工具链版本依赖问题,wasm以及基础库编译最好在ubuntu20.04及以上版本环境编译 以ubuntu20.04 环境为例,需要软件安装包 ``` apt-get install wget -y apt-get install build-essential -y apt-get install libssl-dev \ libpcre3 \ libpcre3-dev \ zlib1g \ zlib1g-dev \ cmake -y apt-get install unzip -y apt-get install gcc g++ make cmake libpcre2-dev \ perl m4 git libtool automake \ autoconf vim-common unzip libcap2-bin \ cmake -y ``` === 快速开始 === $ 创建build 目录 ``` mkdir build && cd build ``` $ 编译wasm运行时环境以及生成wasm 文件 ``` cp ../build_wasm_runtimer.sh ./ sh build_wasm_runtimer.sh ``` $ 编译njet 以及生成 wasm 示例模块so动态库 ``` cp ../build_njet.sh ./ sh build_njet.sh ``` $ 需要将wasm运行时库设置到系统搜索路径(有的环境LD_LIBRARY_PATH不生效,可直接将动态库直接copy到系统搜索路径下) ``` LD_LIBRARY_PATH=`pwd`/wasm-micro-runtime-WAMR-1.3.2/build:$LD_LIBRARY_PATH 或者将动态库直接copy到系统搜索路径下(ubuntu20.04环境为例) sudo cp `pwd`/wasm-micro-runtime-WAMR-1.3.2/build/*.so /lib/x86_64-linux-gnu/ ``` $ 运行njet ``` njet默认安装路径为/usr/local/njet, 推荐如下结构存放配置动态库等 sbin/njet: exec file modules/*.so: all modules's so file, include wasm module so logs/: log dir conf/: all config file ``` 启动njet: ``` /usr/local/njet/sbin/njet -p /usr/local/njet -c conf/njet.conf ``` 停止njet: ``` /usr/local/njet/sbin/njet -p /usr/local/njet -c conf/njet.conf -s stop ``` $ 测试wasm模块 njet配置启动端口8080 变量求和示例: ``` $ curl "http://127.0.0.1:8080/?a=1&b=2&c=3" sum('1','2','3','')=6 ``` HTTP请求示例: ``` $ curl -s -v -X PUT -T build_njet.sh -o download.txt http://127.0.0.1:8080/wasm?body=rw 这个示例能够读取request请求的header(foo)和body 同时将读取到的foo header数据以及body作为响应的body返回,保存到download.txt文件里 同时在响应header部分添加hello:wasm 以及x-foo:aa body=r: 表示读取request body body=w: 表示响应body body=rw: 表示读取request body内容并响应到response body ``` FAQ: ``` 如果使用wasmtime 运行时环境,由于环境相关版本依赖,如果在低版本系统上使用,可能需要手工编译wasmtime运行时库。 编译OpenNJet支持wasmtime运行时模块时,只需要将build_njet.sh 关于涉及WTIME_CAPI 宏的部分注释打开即可 ```