Application Gateway での WebSocket のサポートの概要Overview of WebSocket support in Application Gateway

Application Gateway では、あらゆる規模のゲートウェイで WebSocket がネイティブにサポートされます。Application Gateway provides native support for WebSocket across all gateway sizes. ユーザーが構成可能な、WebSocket のサポートを選択的に有効または無効にするための設定はありません。There is no user-configurable setting to selectively enable or disable WebSocket support.

RFC6455 で標準化された WebSocket プロトコルは、長時間に及ぶ TCP 接続上でサーバーとクライアント間の全二重通信を可能にします。WebSocket protocol standardized in RFC6455 enables a full duplex communication between a server and a client over a long running TCP connection. この機能により、HTTP ベースの実装では必須だったポーリングを使用することなく、Web サーバーとクライアントの間により対話的な双方向通信が可能になります。This feature allows for a more interactive communication between the web server and the client, which can be bidirectional without the need for polling as required in HTTP-based implementations. WebSocket は、HTTP とは異なってオーバーヘッドが少なく、複数の要求や応答で同じ TCP 接続を再利用できるため、リソースをより効率的に使用できます。WebSocket has low overhead unlike HTTP and can reuse the same TCP connection for multiple request/responses resulting in a more efficient utilization of resources. WebSocket プロトコルは、従来の HTTP ポート 80 および 443 上で動作するよう設計されています。WebSocket protocols are designed to work over traditional HTTP ports of 80 and 443.

これまでどおり標準の HTTP リスナーをポート 80 または 443 で使用して WebSocket トラフィックを受信することができます。You can continue using a standard HTTP listener on port 80 or 443 to receive WebSocket traffic. WebSocket トラフィックは、アプリケーション ゲートウェイの規則で指定されている適切なバックエンド プールを使用して、WebSocket が有効なバックエンド サーバーに送られます。WebSocket traffic is then directed to the WebSocket enabled backend server using the appropriate backend pool as specified in application gateway rules. バックエンド サーバーは、アプリケーション ゲートウェイ プローブに応答する必要があります (アプリケーション ゲートウェイ プローブについては、正常性プローブの概要に関するセクションをご覧ください)。The backend server must respond to the application gateway probes, which are described in the health probe overview section. アプリケーション ゲートウェイの正常性プローブは HTTP/HTTPS のみです。Application gateway health probes are HTTP/HTTPS only. アプリケーション ゲートウェイが WebSocket トラフィックをサーバーにルーティングするには、各バックエンド サーバーが HTTP プローブに応答する必要があります。Each backend server must respond to HTTP probes for application gateway to route WebSocket traffic to the server.

これは、チャット、ダッシュボード、ゲーム アプリなど、高速でリアルタイムの通信を利用するアプリケーションで使用されます。It's used in apps that benefit from fast, real-time communication, such as chat, dashboard, and game apps.

WebSocket のしくみHow does WebSocket work

WebSocket の接続を確立するために、特定の HTTP ベースのハンドシェイクがクライアントとサーバーの間で交換されます。To establish a WebSocket connection, a specific HTTP-based handshake is exchanged between the client and the server. 成功すると、アプリケーション レイヤー プロトコルは、以前に確立された TCP 接続を使用して、HTTP から WebSockets に "アップグレード" されます。If successful, the application-layer protocol is "upgraded" from HTTP to WebSockets, using the previously established TCP connection. これが発生すると、HTTP は完全に無関係になります。WebSocket 接続が閉じられるまで、両方のエンドポイントによって WebSocket プロトコルを使用してデータが送受信されます。Once this occurs, HTTP is completely out of the picture; data can be sent or received using the WebSocket protocol by both endpoints, until the WebSocket connection is closed.

addcert

リスナーの構成要素Listener configuration element

既存の HTTP リスナーを使用して WebSocket トラフィックをサポートできます。An existing HTTP listener can be used to support WebSocket traffic. サンプル テンプレート ファイルの httpListeners 要素のスニペットを次に示します。The following is a snippet of an httpListeners element from a sample template file. WebSocket トラフィックおよびセキュリティで保護された WebSocket トラフィックをサポートするには、HTTP リスナーと HTTPS リスナーの両方が必要です。You would need both HTTP and HTTPS listeners to support WebSocket and secure WebSocket traffic. 同様に、ポータルまたは Azure PowerShell を使用して、ポート 80/443 にリスナーを設定したアプリケーション ゲートウェイを作成して WebSocket トラフィックをサポートできます。Similarly you can use the portal or Azure PowerShell to create an application gateway with listeners on port 80/443 to support WebSocket traffic.

"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, BackendHttpSetting, and Routing rule configuration

WebSocket が有効なサーバーにバックエンド プールを定義するには、BackendAddressPool を使用します。A BackendAddressPool is used to define a backend pool with WebSocket enabled servers. backendHttpSetting は、バックエンド ポート 80 および 443 を使用して定義されます。The backendHttpSetting is defined with a backend port 80 and 443. Cookie ベースのアフィニティのプロパティと requestTimeouts は、WebSocket のトラフィックには関係ありません。The properties for cookie-based affinity and requestTimeouts are not relevant to WebSocket traffic. 適切なリスナーを対応するバックエンド アドレス プールに結び付けるには、引き続きルーティング規則の "Basic" を使用する必要があります。There is no change required in the routing rule, 'Basic' is used to tie the appropriate listener to the corresponding backend address pool.

"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')]"
        }

    }
}]

WebSocket が有効なバックエンドWebSocket enabled backend

WebSocket が動作するためには、バックエンドの構成済みのポート (通常は 80/443) で HTTP/HTTPS Web サーバーが実行されている必要があります。Your backend must have a HTTP/HTTPS web server running on the configured port (usually 80/443) for WebSocket to work. この要件は、WebSocket プロトコルでは最初のハンドシェイクで HTTP を使用し、ヘッダー フィールドで WebSocket プロトコルへのアップグレードを指定する必要があるためです。This requirement is because WebSocket protocol requires the initial handshake to be HTTP with upgrade to WebSocket protocol as a header field. ヘッダーの例を次に示します。The following is an example of a header:

    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 のみであるという点が挙げられます。Another reason for this is that application gateway backend health probe supports HTTP and HTTPS protocols only. バックエンド サーバーが HTTP または HTTPS プローブに応答しない場合、そのバックエンド サーバーはバックエンド プールから取り除かれます。If the backend server does not respond to HTTP or HTTPS probes, it is taken out of backend pool.

次の手順Next steps

WebSocket のサポートについて学習した後は、 アプリケーション ゲートウェイの作成 に関するページに進んで、WebSocket が有効な Web アプリケーションを作成しましょう。After learning about WebSocket support, go to create an application gateway to get started with a WebSocket enabled web application.