ブログ記事「WebSocketプロキシとしてのNGINX」では、NGINXを使用してWebSocketアプリケーションサーバーをプロキシする方法について説明しました。この記事では、WebSocketを使用してリアルタイムアプリケーションを構築する際に検討すべきアーキテクチャとインフラストラクチャの課題について、必要なコンポーネントやシステムの構成方法も含めて説明します。
WebSocketでHTTPにインタラクティブ性を追加
HTTPは、常にクライアントがリクエストを開始し、バックエンドサーバーがそれに応答するという、リクエスト/レスポンス方式のWebアプリケーションに適しています。クライアントとサーバー間で、よりインタラクティブなメッセージベースのやり取りを行うWebアプリケーションには、単純なHTTPを超える仕組みが必要です。従来、HTTP上で全二重通信を再現する試みは複雑で、多くの欠点がありました。WebSocketプロトコルとWebSocket JavaScriptインターフェースを使用すると、このようなアプリケーションをはるかに簡単に構築できるほか、転送データ量とレイテンシーも削減できます。
クライアントとサーバー間で全二重のソケット接続を確立できるため、プッシュ、ポーリング、ストリーミング通信を利用するリアルタイムのイベント駆動型Webアプリケーションを開発できます。WebSocketでは、接続の確立後、クライアントとサーバーのどちらからでも通信を開始できます。これにより、オンラインゲーム、チャット、株価追跡、スポーツの試合結果のリアルタイム配信など、さまざまなWebアプリケーションを実現できます。
WebSocketのもう1つのユースケースは、WebRTCベースのアプリケーション開発です。WebRTCは、ブラウザ間通信を行うアプリケーションの作成に使用されます。通信を確立するには別途シグナリングチャネルが必要であり、その用途にはWebSocketが適しています。
WebSocketアプリケーションの技術要件
WebSocket Webアプリケーションに最低限必要なインフラストラクチャは、WebSocket JavaScriptアプリケーションを実行し、WebSocketサーバーと通信するクライアントブラウザーです。現在、主要なブラウザーの最新リリースはすべてWebSocketをサポートしていますが、クライアントがWebSocket対応ブラウザーを使用していることを確認することが重要です。WebSocketサーバーには多くの選択肢があります。以下に、さまざまな環境向けの例を示します(このリストは便宜上掲載するものであり、NGINX, Inc.が推奨するものではありません)。
WebSocketを大規模トラフィックに対応させる
単一のWebSocketサーバーを使用することも可能ですが、アプリケーションのパフォーマンスはそのサーバーの処理能力に制約されます。また、そのサーバーが単一障害点にもなります。多くのリアルタイムアプリケーションは、広く普及することを期待して開発されますが、その成長率を予測するのは困難です。リアルタイムアプリケーションの利用拡大に対応するには、インフラストラクチャに以下の機能が必要です。
- 多数の同時接続ユーザーに対応できるように拡張する
- クライアントとサーバー間の通信処理を低レイテンシで実行
- 高可用性をサポート(単一障害点がないことを意味します)
- 構成を容易に変更でき、状況の変化に適応できるようにする
これを実現するには、WebSocketサーバーとHTTPサーバー(ほとんどのWebSocketアプリケーションはHTTPも使用するため)の前段にNGINXを配置し、WebSocket対応のリバースプロキシおよびロードバランサーとして機能させます。すべてのリバースプロキシがWebSocketを直接サポートしているわけではありません。たとえば、Amazon Web Services(AWS)環境のElastic Load Balancing(ELB)などはTCPモードで実行する必要があるため、HTTPヘッダーを処理できません。この制約に対処するために、Proxy Protocolが開発されました。NGINXもこれをサポートしているため、AWSでWebSocketを完全にサポートできます。NGINXをWebSocketリバースプロキシとして使用すると、柔軟なルーティングや、NGINXでSSL接続を終端できることなど、さらなるメリットが得られます。
NGINXを使用した一般的なWebSocket構成は、次のようになります。

ここでは、さまざまなデスクトップクライアントとモバイルクライアントが、複数のHTTPサーバーとWebSocketサーバーの負荷を分散する高可用性構成の2台のNGINXサーバーに接続しています。この構成では、WebSocketサーバーまたはNGINXサーバーに障害が発生しても運用を継続でき、WebSocketサーバーも簡単に追加または削除できます。また、WebSocketサーバーへの接続方法に関するルーティングの詳細はすべてクライアントから隠蔽されるため、堅牢で拡張性の高いWebSocketアプリケーションインフラストラクチャを構築できます。リアルタイムWebアプリケーションには、Webのパフォーマンスと信頼性が不可欠です。今すぐお問い合わせください。NGINX Plusがアプリケーションのパフォーマンス、信頼性、可用性の向上にどのように役立つかをご案内します。
詳細については、以下をご覧ください。
- WebSocketプロキシとしてのNGINX
- NGINX WebSocketのパフォーマンス
- WebSocketプロキシ(nginx.org)
- NGINXとNGINX Plusの機能比較
- NGINX Plus技術仕様
著者について

関連するブログ記事
チュートリアル: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グループの負荷を直接分散できるため、クラウドでの負荷分散がさらに柔軟になります