Go 製の HTTP フォワードプロキシ。リクエスト/レスポンス処理を TinyGo 製 WASM プラグイン で拡張でき、プロキシを再起動せずに ホットリロード でプラグインを差し替えられます。
cmd/xynon/ ← プロキシの CLI エントリポイント
internal/config/ ← 設定ローダ
internal/plugin/ ← WASM ランタイム・ABI・ローダ
internal/plugin/abi/ ← ABI 定数・ドキュメント
internal/proxy/ ← プロキシハンドラ・チェーンレジストリ・ホットリロード
examples/plugins/ ← サンプルプラグイン
examples/config.yaml ← サンプル設定
CGO_ENABLED=0 go build -o bin/xynon ./cmd/xynonTinyGo 0.40.1 は Go 1.19–1.25 をサポートしています。Go 1.23 を用意し、以下のように GOROOT を指定してビルドします。
GO123=/path/to/go1.23 # mise 例: ~/.local/share/mise/installs/go/1.23.12
cd /tmp # プロジェクト go.mod の干渉を避けるため /tmp で実行
GOROOT="$GO123" GOWORK=off PATH="$GO123/bin:$PATH" \
tinygo build \
-o /path/to/xynon/examples/plugins/add-header/add-header.wasm \
-target wasip1 \
/path/to/xynon/examples/plugins/add-header/main.goまたは Makefile ターゲットを使用します(make が利用可能な場合):
make plugins./bin/xynon -config examples/config.yaml| フラグ | デフォルト | 説明 |
|---|---|---|
-config |
config.yaml |
設定ファイルパス |
-no-hot-reload |
false |
ホットリロードを無効化し起動時チェーン固定 |
プロキシを起動せずにプラグインを管理するサブコマンド群です。
./bin/xynon plugin list -config examples/config.yamlプラグインディレクトリの .wasm ファイルとチェーン登録状態(順序番号)を表示します。
./bin/xynon plugin add -config examples/config.yaml ./path/to/my-plugin.wasm指定した WASM ファイルをプラグインディレクトリにコピーし、設定ファイルのチェーン末尾に追加します。同名プラグインが既に登録済みの場合はファイルのみ上書きします。
./bin/xynon plugin remove -config examples/config.yaml my-plugin設定ファイルのチェーンから指定名のプラグインを削除します。WASM ファイル自体は削除されません。
./bin/xynon plugin build -config examples/config.yaml ./examples/plugins/add-header指定ディレクトリの TinyGo ソースをビルドし、設定ファイルのプラグインディレクトリに <ディレクトリ名>.wasm を出力します。
| 環境変数 | 説明 |
|---|---|
TINYGO |
tinygo バイナリのパス(未設定時は PATH から解決) |
XYNON_TINYGO_GOROOT |
TinyGo に渡す GOROOT(Go 1.26+ 環境で TinyGo 0.40.1 を使う場合は Go 1.23 の GOROOT を指定) |
listen: ":8080"
plugins:
dir: "./examples/plugins"
chain:
- name: add-header # examples/plugins/add-header/add-header.wasm を使用| フィールド | 必須 | 説明 |
|---|---|---|
listen |
✓ | リスンアドレス(例: :8080) |
plugins.dir |
✓ | WASM ファイルが置かれるディレクトリ |
plugins.chain[] |
- | 有効化するプラグインと実行順序 |
-
プロキシを起動する:
./bin/xynon -config examples/config.yaml
-
別ターミナルでリクエストを送信する:
curl -x http://localhost:8080 http://httpbin.org/headers
レスポンスヘッダに
X-Xynon: trueが含まれることを確認します。 -
プラグインの WASM ファイルを上書きする(別バージョンのプラグインに差し替え):
cp new-plugin.wasm examples/plugins/add-header/add-header.wasm
プロキシのログに
hot-reload completeが表示され、次のリクエストから新バージョンが適用されます。 -
プロキシは
Ctrl+C(SIGINT) または SIGTERM でシャットダウンします。
プラグインは internal/plugin/abi/abi.go に記載された ABI を実装します。
//export xynon_abi_version
func xynon_abi_version() int32 { return 1 }
//export on_request
func on_request(handle int32) int32 { /* 0=continue, 1=short-circuit, 2=error */ }
//export on_response
func on_response(handle int32) int32 { /* 0=continue, 1=short-circuit, 2=error */ }| 関数 | シグネチャ | 説明 |
|---|---|---|
get_header |
(handle, namePtr, nameLen, outPtr, outCap) -> i32 |
ヘッダ値を読み取る |
set_header |
(handle, namePtr, nameLen, valPtr, valLen) -> i32 |
ヘッダを設定する |
set_status |
(handle, status) -> i32 |
レスポンスステータスコードを設定する |
short_circuit |
(handle, status) -> i32 |
指定ステータスで即時応答(on_request のみ有効) |
xynon_log |
(handle, msgPtr, msgLen) -> i32 |
ログ出力 |
ハンドルは各フック呼び出しの間のみ有効です。フック終了後に使用するとエラーが返ります。
- ABI バージョンは
internal/plugin/abi/abi.goのCurrentVersion定数で管理します。 - ホストは自身がサポートするバージョンのプラグインのみロードします。非対応バージョンはロード時に拒否されます。
- 破壊的変更(関数シグネチャ変更・削除)を行う場合は
CurrentVersionをインクリメントします。 - 後方互換な追加(新しいホスト関数の追加)は同一バージョン内で行えます。プラグインは不要なホスト関数をインポートしなくても動作します。