WebAssembly(略称:Wasm)は、Webアプリケーションの世界に多くの可能性をもたらします。ブラウザでは、セキュアなサンドボックス実行環境を提供し、フロントエンド開発者がパフォーマンスを損なうことなく、JavaScriptだけでなく、さまざまな高水準言語を使用できるようにします。また、バックエンド(サーバーサイド)では、WebAssemblyのクロスプラットフォーム対応と複数アーキテクチャ間の移植性により、開発、デプロイ、スケーリングがこれまで以上に容易になることが期待されます。
NGINXが目指すのは、サーバーサイドのWebAssemblyモジュールを作成し、変更を加えることなく、複数のビルドパイプラインも必要とせず、どこでも実行できる世界です。WebAssemblyモジュールをローカル開発環境からミッションクリティカルなマルチクラウド環境まで、そのまま一貫して実行できるようにします。
このビジョンは、NGINX Unit 1.31のリリースによって実現します。NGINX Unitは汎用Webアプリケーションサーバーであり、アプリケーションコードを、TLS、静的ファイル、リクエストルーティングといった不可欠な機能とともに実行できます。さらに、NGINX Unitはこれらすべてに対応しながら、7つのプログラミング言語ランタイムに加え、WebAssemblyでも一貫した開発者エクスペリエンスを提供します。
NGINX UnitにWebAssemblyを追加することには、さまざまな面で合理性があります。
- HTTPのリクエスト/レスポンスパターンは、WebAssemblyサンドボックスの入出力(I/O)バイトストリームと自然に適合します。
- 開発者は、ランタイム性能を損なうことなく、高水準言語による高い生産性を実現できます。
- NGINX Unitのリクエストルーターは、複数のWebAssemblyモジュールを組み合わせた複雑なアプリケーションの構築を容易にします。
- WebAssemblyは起動が高速なため、単一のマイクロサービスや関数から、フル機能のアプリケーションまで、幅広いデプロイに適しています。
- 汎用的な移植性とクロスプラットフォーム互換性により、複雑なビルドパイプラインを使用せずにローカルで開発できます。
- NGINX Unitはすでにアプリケーション単位の分離機能を提供しており、WebAssemblyサンドボックスによって、信頼できないコードをさらに安全に実行できます。
注記:本稿執筆時点では、WebAssemblyモジュールはTechnology Previewです。詳細は以下をご覧ください。
NGINX Unit WebAssemblyモジュールの仕組み
NGINX Unitのアーキテクチャでは、ネットワークプロトコルとアプリケーションランタイムが分離されています。unitd: routerプロセスは受信したHTTPリクエストを処理し、必要に応じてTLSレイヤーも処理します。このリクエストの処理方法を決定した後、「HTTPコンテキスト」(URI、ヘッダー、本文)がアプリケーションランタイムに渡されます。
多くのプログラミング言語では、HTTPコンテキストをアプリケーションコードで利用できるようにする方法と、開発者がURI、ヘッダー、本文にアクセスする方法が厳密に規定されています。NGINX Unitは、NGINX Unitのルーターとアプリケーションランタイムの間のインターフェース層を実装する複数の言語モジュールを提供します。
NGINX UnitのWebAssembly言語モジュールは、WebAssemblyランタイムとルータープロセスの間に同様のインターフェース層を提供します。WebAssemblyサンドボックスの「線形メモリ」は、現在のリクエストのHTTPコンテキストで初期化され、確定したレスポンスはクライアントに送信するためにルーターへ返されます。
サンドボックス化された実行環境は、Wasmtimeランタイムによって提供されます。以下の図は、クライアントからルーターを経由し、Wasmtimeで実行されるWebAssemblyモジュールに至るHTTPリクエストの流れを示しています。
NGINX UnitでWebAssemblyモジュールを実行する
WebAssemblyモジュールを実行するためのNGINX Unitの設定は、他の言語の場合と同様に簡単です。以下の設定スニペットには、次の属性を持つhelloworldというアプリケーションがあります。
typeは、このアプリケーションに読み込む言語モジュールを指定しますmoduleは、コンパイル済みのWebAssemblyバイトコードを指しますaccessは、アプリケーションがサンドボックス外のリソースにアクセスできるようにするWasmtimeランタイムの機能ですrequest_handler、malloc_handler、およびfree_handlerは、HTTPコンテキストをWasmtimeに転送するSDK関数に関連しています(詳しくは次のセクションで説明します)
{
"applications":{
"helloworld":{
"type":"wasm",
"module":"/path/to/wasm_module.wasm",
"access":{
"filesystem":[
"/tmp",
"/var/tmp"
]
},
"request_handler":"luw_request_handler",
"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上で実行できるWebアプリケーションやAPIを簡単に作成できます。WebAssemblyのハウツーガイドでは、開発環境とビルド手順をご確認いただけます。
WebAssemblyをユニバーサルランタイムとして活用するという構想と、その可能性を実現したいという思いはあるものの、このSDKで構築したアプリケーションはNGINX Unit上でのみ動作します。そのため、WebAssemblyサポートはTechnology Previewとして提供します。対応が可能になり次第、WASI-HTTPサポートに置き換える予定です。
Technology Previewを試す
このTechnology Previewでは、Webアプリケーションを実行するための軽量サーバーを提供するとともに、サーバーサイドWebAssemblyの可能性をご紹介します。ぜひ気軽に試し、さまざまな実験を行って、フィードバックをお寄せください。ご意見は、NGINX Community SlackまたはNGINX Unit GitHubリポジトリからお寄せいただけます。
まず、NGINX Unitをインストールし、WebAssemblyのハウツーガイドをご覧ください
著者について

関連するブログ記事
チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する
OpenTelemetryを使用してNGINXサーバーの状態と健全性をより明確に把握することで、問題のトラブルシューティングを行い、Webアプリケーションのパフォーマンスを向上できます。
AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正
Akita SoftwareのAPIオブザーバビリティ向け新しいNGINX Plus Certified Moduleを活用して、APIエンドポイントの問題をより迅速に特定し、修正できます。
JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法
Red HatのシニアプリンシパルデベロッパーアドボケイトであるDaniel Oh氏が、Javaプロジェクトをゼロから構築するためのひな形を作成し、Kubernetesネイティブアプリケーションとしてビルドする方法を解説します。
F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング
NGINXaaS for Azureは、NGINX PlusをAzureネイティブのSaaSとして利用できるサービスです。NGINXの設定を容易にリフト&シフトできるため、クラウド導入とモダンアプリの展開を加速できます。

SELinuxでNGINXおよびNGINX Plusを使用する
Red Hat Enterprise Linux(RHEL)および関連ディストリビューションでSecurity-Enhanced Linux(SELinux)を有効にすると、デフォルト設定によりNGINXとNGINX Plusの一部の操作が制限されます。この記事では、すべての機能を利用できるようにSELinuxの設定を変更する方法について説明します。
NGINX PlusによるAWS Auto Scalingグループの負荷分散
新しいnginx-asg-sync統合ソフトウェアにより、NGINX PlusはAWS Auto Scalingグループの負荷を直接分散できるため、クラウドでの負荷分散がさらに柔軟になります