WebSocketとNGINXによるリアルタイムWebアプリケーション

NGINX | 2014年7月21日

ブログ記事「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がアプリケーションのパフォーマンス、信頼性、可用性の向上にどのように役立つかをご案内します。

詳細については、以下をご覧ください。


共有

著者について

Rick Nelson
Rick Nelsonソリューションエンジニアリング担当リージョナルバイスプレジデント

Rick Nelsonのその他のブログ記事

関連するブログ記事

チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する
NGINX | 2024/01/18

チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する

OpenTelemetryを使用してNGINXサーバーの状態と健全性をより明確に把握することで、問題のトラブルシューティングを行い、Webアプリケーションのパフォーマンスを向上できます。

AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正
NGINX | 2023/05/31

AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正

Akita SoftwareのAPIオブザーバビリティ向け新しいNGINX Plus Certified Moduleを活用して、APIエンドポイントの問題をより迅速に特定し、修正できます。

JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法
NGINX | 2023/02/09

JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法

Red HatのシニアプリンシパルデベロッパーアドボケイトであるDaniel Oh氏が、Javaプロジェクトをゼロから構築するためのひな形を作成し、Kubernetesネイティブアプリケーションとしてビルドする方法を解説します。

F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング
NGINX | 2022/05/24

F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング

NGINXaaS for Azureは、NGINX PlusをAzureネイティブのSaaSとして利用できるサービスです。NGINXの設定を容易にリフト&シフトできるため、クラウド導入とモダンアプリの展開を加速できます。

SELinuxでNGINXおよびNGINX Plusを使用する
NGINX | 2018/08/17

SELinuxでNGINXおよびNGINX Plusを使用する

Red Hat Enterprise Linux(RHEL)および関連ディストリビューションでSecurity-Enhanced Linux(SELinux)を有効にすると、デフォルト設定によりNGINXとNGINX Plusの一部の操作が制限されます。この記事では、すべての機能を利用できるようにSELinuxの設定を変更する方法について説明します。

NGINX PlusによるAWS Auto Scalingグループの負荷分散
NGINX | 2017/03/06

NGINX PlusによるAWS Auto Scalingグループの負荷分散

新しいnginx-asg-sync統合ソフトウェアにより、NGINX PlusはAWS Auto Scalingグループの負荷を直接分散できるため、クラウドでの負荷分散がさらに柔軟になります