ブログ | NGINX

NGINX ユニットを使用したサーバーサイド WebAssembly

NGINX-F5 水平黒タイプ RGB の一部
リアム・クリリー サムネイル
リアム・クリリー
2023年9月5日公開

WebAssembly (略称Wasm ) は、Webapplicationsの世界に多くのメリットをもたらします。 ブラウザでは、安全なサンドボックス化された実行環境が提供され、フロントエンド開発者はパフォーマンスを犠牲にすることなく、さまざまな高水準言語 (JavaScript だけではありません!) で作業できるようになります。 また、バックエンド (サーバー側) では、WebAssembly のクロスプラットフォーム サポートとマルチアーキテクチャの移植性により、開発、展開、スケーラビリティがこれまで以上に容易になります。

NGINX では、サーバー側の WebAssembly モジュールを作成し、変更や複数のビルド パイプラインなしでどこでも実行できる世界を思い描いています。 代わりに、WebAssembly モジュールはローカル開発から開始され、ミッションクリティカルなマルチクラウド環境まで実行されます。

NGINX Unit 1.31 のリリースにより、このビジョンを実現できることを嬉しく思います。 NGINX Unitはユニバーサルウェブアプリサーバーです applicationコードは、TLS、静的ファイル、およびリクエスト ルーティングの他の重要な属性とともに実行されます。 さらに、NGINX Unit はこれらすべてを実行し、 7 つのプログラミング言語ランタイム、そして今では WebAssembly にも一貫した開発者エクスペリエンスを提供します。

NGINX Unit に WebAssembly を追加することは、さまざまなレベルで意味があります。

  • HTTP のリクエスト/レスポンス パターンは、WebAssembly サンドボックスの入出力 (I/O) バイト ストリームに自然に適合します。
  • 開発者は、実行時のパフォーマンスを損なうことなく、高水準言語の生産性を享受できます。
  • NGINX Unit のリクエスト ルーターを使用すると、複数の WebAssembly モジュールから複雑なapplicationsを簡単に構築できます。
  • WebAssembly は起動時間が短いため、単一のマイクロサービスや関数、さらにはフル機能のapplicationsのデプロイにも適しています。
  • ユニバーサルな移植性とクロスプラットフォームの互換性により、複雑なビルド パイプラインなしでローカル開発が可能になります。
  • NGINX Unit はすでにアプリケーションごとの分離を提供しており、WebAssembly サンドボックスにより信頼できないコードの実行がさらに安全になります。

注記: この記事の執筆時点では、WebAssembly モジュールはテクノロジー プレビューです。詳細は以下をご覧ください。

NGINX Unit WebAssembly モジュールはどのように機能しますか?

NGINX Unit のアーキテクチャは、ネットワーク プロトコルをapplicationランタイムから分離します。 unitd: ルータープロセスは、受信 HTTP 要求を処理し、必要に応じて TLS レイヤーを処理します。 このリクエストをどのように処理するかを決定した後、「HTTP コンテキスト」(URI、ヘッダー、本文) がapplicationランタイムに渡されます。

多くのプログラミング言語には、HTTP コンテキストをapplicationコードで利用できるようにする方法や、開発者が URI、ヘッダー、本文にアクセスする方法についての正確な仕様があります。 NGINX Unit は、NGINX Unit のルーターとapplicationランタイム間のインターフェイス レイヤーを実装するいくつかの言語モジュールを提供します。

NGINX Unit の WebAssembly 言語モジュールは、WebAssembly ランタイムとルーター プロセスの間に同様のインターフェース レイヤーを提供します。 WebAssembly サンドボックスの線形メモリは、現在のリクエストの HTTP コンテキストで初期化され、最終的な応答がルーターに送り返されてクライアントに送信されます。

サンドボックス化された実行環境は、 Wasmtimeランタイムによって提供されます。 以下の図は、クライアントからルーターを経由して Wasmtime によって実行される WebAssembly モジュールまでの HTTP リクエストのフローを示しています。

クライアントからルーターを経由して Wasmtime によって実行される WebAssembly モジュールまでの HTTP リクエストのフローの図。

NGINX ユニットで WebAssembly モジュールを実行する

WebAssembly モジュールを実行するように NGINX Unit を構成するのは、他の言語の場合と同じくらい簡単です。 以下の構成スニペットには、次の属性を持つhelloworldというapplicationがあります。

  • タイプは、このapplicationにロードされる言語モジュールを定義します。
  • モジュールはコンパイルされたWebAssemblyバイトコードを指します
  • アクセスは、applicationがサンドボックス外のリソースにアクセスできるようにするWasmtimeランタイムの機能です。
  • request_handlermalloc_handlerfree_handlerは、HTTPコンテキストをWasmtimeに転送するSDK関数に関連しています(次のセクションで詳しく説明します)。
{
「applications」:{
"こんにちは世界":{
"タイプ":"wasm",
"モジュール":"/path/to/wasm_module.wasm",
"アクセス":{
「ファイルシステム」:[
"/tmp",
"/var/tmp"
]
},
"リクエストハンドラ":"luw_リクエストハンドラ",
"malloc_handler":"luw_malloc_handler",
"free_handler":"luw_free_handler"
}
}
}

WebAssembly サンドボックス内で HTTP コンテキストを見つける

前述のように、NGINX Unit の WebAssembly 言語モジュールは、現在のリクエストの HTTP コンテキストを使用して WebAssembly 実行サンドボックスを初期化します。 多くのプログラミング言語ランタイムは HTTP メタデータへのネイティブな直接アクセスを提供しますが、WebAssembly にはそのような標準は存在しません。

WASI-HTTP標準が最終的にこのニーズを満たすことを期待していますが、その間、 Rust と C 用のソフトウェア開発キット (SDK)を提供しています。Unit-Wasm SDK を使用すると、WebAssembly にコンパイルされ、NGINX Unit で実行される Webapplicationsと API を簡単に作成できます。 WebAssembly のハウツーガイドでは、開発環境とビルド手順について詳しく説明しています。

WebAssembly のユニバーサル ランタイムとしての可能性を実現するという私たちのビジョンと願望にもかかわらず、この SDK で構築されたapplicationsはNGINX Unit 上でのみ実行されます。 このため、WebAssembly サポートをテクノロジー プレビューとして導入し、可能になり次第、WASI-HTTP サポートに置き換える予定です。

テクノロジープレビューを試す

テクノロジー プレビューは、Webapplicationsを実行するための軽量サーバーを提供しながら、サーバー側 WebAssembly の可能性を紹介するために用意されています。 ぜひ「試してみる」という心構えで取り組んでください。実験してみて、フィードバックをお寄せください。 NGINX コミュニティ SlackまたはNGINX ユニット GitHub リポジトリを通じて、皆様からのご意見をお待ちしております。

始めるには、 NGINX Unitをインストールし、 WebAssemblyのハウツーガイドに進んでください。


「このブログ投稿には、入手できなくなった製品やサポートされなくなった製品が参照されている場合があります。 利用可能な F5 NGINX 製品およびソリューションに関する最新情報については、 NGINX 製品ファミリーをご覧ください。 NGINX は現在 F5 の一部です。 以前の NGINX.com リンクはすべて、F5.com の同様の NGINX コンテンツにリダイレクトされます。"