Application Gateway では、あらゆる規模のゲートウェイで WebSocket がネイティブにサポートされます。 ユーザーが構成可能な、WebSocket のサポートを選択的に有効または無効にするための設定はありません。
RFC6455 で標準化された WebSocket プロトコルは、長時間に及ぶ TCP 接続上でサーバーとクライアント間の全二重通信を可能にします。 この機能により、HTTP ベースの実装では必須だったポーリングを使用することなく、Web サーバーとクライアントの間により対話的な双方向通信が可能になります。 WebSocket は、HTTP とは異なってオーバーヘッドが少なく、複数の要求や応答で同じ TCP 接続を再利用できるため、リソースをより効率的に使用できます。 WebSocket プロトコルは、従来の HTTP ポート 80 および 443 上で動作するよう設計されています。 Application Gateway では、インスタンスあたり最大 30,000 個の同時 WS 接続と 13,500 個の WSS 接続がサポートされます。
これまでどおり標準の HTTP リスナーをポート 80 または 443 で使用して WebSocket トラフィックを受信することができます。 WebSocket トラフィックは、アプリケーション ゲートウェイの規則で指定されている適切なバックエンド プールを使用して、WebSocket が有効なバックエンド サーバーに送られます。 バックエンド サーバーは、アプリケーション ゲートウェイ プローブに応答する必要があります (これは、正常性プローブの概要に関するセクションを参照してください)。 アプリケーション ゲートウェイの正常性プローブは HTTP/HTTPS のみです。 アプリケーション ゲートウェイが WebSocket トラフィックをサーバーにルーティングするには、各バックエンド サーバーが HTTP プローブに応答する必要があります。
これは、チャット、ダッシュボード、ゲーム アプリなど、高速でリアルタイムの通信を利用するアプリケーションで使用されます。
WebSocket のしくみ
WebSocket の接続を確立するために、特定の HTTP ベースのハンドシェイクがクライアントとサーバーの間で交換されます。 成功すると、アプリケーション レイヤー プロトコルは、以前に確立された TCP 接続を使用して、HTTP から WebSockets に "アップグレード" されます。 これが発生すると、HTTP は完全に無関係になります。WebSocket 接続が閉じられるまで、両方のエンドポイントによって WebSocket プロトコルを使用してデータが送受信されます。
注
接続が WebSocket にアップグレードされた後、中間プロキシまたは終了プロキシとして、Application Gateway は、フロントエンドから受信したデータを、検査や操作機能なしでバックエンドに送信します。その逆も同様です。 そのため、Web Application Firewall (WAF) はコンテンツを解析できないため、そのようなデータに対して検査を実行しません。 同様に、バックエンド設定でのヘッダーの書き換え、URL の書き換え、またはホスト名のオーバーライドなどの操作は、WebSocket 接続を確立した後には適用されません。
リスナーの構成要素
既存の HTTP リスナーを使用して WebSocket トラフィックをサポートできます。 次のスニペットは、サンプル テンプレート ファイルの httpListeners 要素を示しています。 WebSocket トラフィックとセキュリティで保護された WebSocket トラフィックをサポートするには、HTTP リスナーと HTTPS リスナーの両方が必要です。 同様に、ポータルまたはAzure PowerShellを使用して、WebSocket トラフィックをサポートするポート 80 と 443 にリスナーを含むアプリケーション ゲートウェイを作成できます。
"httpListeners": [
{
"name": "appGatewayHttpsListener",
"properties": {
"FrontendIPConfiguration": {
"Id": "/subscriptions/{subscriptionId/resourceGroups/{resourceGroupName/providers/Microsoft.Network/applicationGateways/{applicationGatewayName/frontendIPConfigurations/DefaultFrontendPublicIP"
},
"FrontendPort": {
"Id": "/subscriptions/{subscriptionId/resourceGroups/{resourceGroupName/providers/Microsoft.Network/applicationGateways/{applicationGatewayName/frontendPorts/appGatewayFrontendPort443'"
},
"Protocol": "Https",
"SslCertificate": {
"Id": "/subscriptions/{subscriptionId/resourceGroups/{resourceGroupName/providers/Microsoft.Network/applicationGateways/{applicationGatewayName/sslCertificates/appGatewaySslCert1'"
},
}
},
{
"name": "appGatewayHttpListener",
"properties": {
"FrontendIPConfiguration": {
"Id": "/subscriptions/{subscriptionId/resourceGroups/{resourceGroupName/providers/Microsoft.Network/applicationGateways/{applicationGatewayName/frontendIPConfigurations/appGatewayFrontendIP'"
},
"FrontendPort": {
"Id": "/subscriptions/{subscriptionId/resourceGroups/{resourceGroupName/providers/Microsoft.Network/applicationGateways/{applicationGatewayName/frontendPorts/appGatewayFrontendPort80'"
},
"Protocol": "Http",
}
}
],
BackendAddressPool、BackendHttpSetting、およびルーティング規則の構成
BackendAddressPool を使用して、WebSocket が有効なサーバーでバックエンド プールを定義します。 バックエンド ポート 80 と 443 を使用して backendHttpSetting を定義します。 HTTP 設定の要求タイムアウト値は、WebSocket セッションにも適用されます。 適切なリスナーを対応するバックエンド アドレス プールに関連付けるルーティング規則を変更する必要はありません。
"requestRoutingRules": [{
"name": "<ruleName1>",
"properties": {
"RuleType": "Basic",
"httpListener": {
"id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/httpListeners/appGatewayHttpsListener')]"
},
"backendAddressPool": {
"id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendAddressPools/ContosoServerPool')]"
},
"backendHttpSettings": {
"id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendHttpSettingsCollection/appGatewayBackendHttpSettings')]"
}
}
}, {
"name": "<ruleName2>",
"properties": {
"RuleType": "Basic",
"httpListener": {
"id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/httpListeners/appGatewayHttpListener')]"
},
"backendAddressPool": {
"id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendAddressPools/ContosoServerPool')]"
},
"backendHttpSettings": {
"id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendHttpSettingsCollection/appGatewayBackendHttpSettings')]"
}
}
}]
注
クライアントから ping が送信される前にタイムアウト エラーが発生しないように、タイムアウト値がサーバーで定義された ping/pong 間隔よりも大きいことを確認します。 WebSocket の一般的な値は 20 秒であるため、たとえばタイムアウト値が 40 秒の場合、クライアントが ping を送信する前にゲートウェイがタイムアウト エラーを送信しないようにします。 それ以外の場合、この条件はクライアント側で 1006 エラーをスローします。
WebSocket 対応バックエンド
WebSocket を機能させるには、バックエンドが構成されたポート (通常は 80 または 443) で実行されている HTTP/HTTPS Web サーバーを持っている必要があります。 WebSocket プロトコルでは、WebSocket プロトコルへのアップグレードをヘッダー フィールドとして使用して、初期ハンドシェイクを HTTP にする必要があるため、この要件が存在します。 ヘッダーの例を次に示します。
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: https://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
この要件のもう 1 つの理由は、アプリケーション ゲートウェイ バックエンド正常性プローブが HTTP プロトコルと HTTPS プロトコルのみをサポートしていることです。 バックエンド サーバーが HTTP または HTTPS プローブに応答しない場合、ゲートウェイによってバックエンド プールから削除されます。
次の手順
WebSocket のサポートについて学習したら、 アプリケーション ゲートウェイを作成 し、WebSocket 対応 Web アプリケーションの使用を開始します。