Dela via


Översikt över WebSocket-stöd i Application Gateway

Application Gateway har inbyggt stöd för WebSocket i alla gatewaystorlekar. Det finns inga inställningar som kan konfigureras av användaren för att selektivt aktivera eller inaktivera WebSocket-stöd.

WebSocket-protokollet som är standardiserat i RFC6455 möjliggör en fullständig dubbelsidig kommunikation mellan en server och en klient över en tidskrävande TCP-anslutning. Den här funktionen möjliggör en mer interaktiv kommunikation mellan webbservern och klienten, som kan vara dubbelriktad utan behov av avsökning som krävs i HTTP-baserade implementeringar. WebSocket har låg belastning till skillnad från HTTP och kan återanvända samma TCP-anslutning för flera begäranden/svar, vilket resulterar i en effektivare resursanvändning. WebSocket-protokoll är utformade för att fungera via traditionella HTTP-portar på 80 och 443.

Du kan fortsätta att använda en HTTP-standardlyssnare på port 80 eller 443 för att ta emot WebSocket-trafik. WebSocket-trafik dirigeras sedan till den WebSocket-aktiverade serverdelsservern med hjälp av lämplig serverdelspool enligt reglerna för programgatewayen. Serverdelsservern måste svara på programgatewayavsökningarna, som beskrivs i avsnittet översikt över hälsoavsökningar. Hälsoavsökningar för Application Gateway är endast HTTP/HTTPS. Varje serverdelsserver måste svara på HTTP-avsökningar för programgatewayen för att dirigera WebSocket-trafik till servern.

Den används i appar som drar nytta av snabb kommunikation i realtid, till exempel chatt, instrumentpanel och spelappar.

Hur fungerar WebSocket

För att upprätta en WebSocket-anslutning utbyts en specifik HTTP-baserad handskakning mellan klienten och servern. Om det lyckas "uppgraderas" protokollet på programnivå från HTTP till WebSockets med hjälp av den tidigare etablerade TCP-anslutningen. När detta inträffar är HTTP helt ute ur bilden; data kan skickas eller tas emot med hjälp av WebSocket-protokollet av båda slutpunkterna tills WebSocket-anslutningen har stängts.

Diagram compares a client interacting with a web server, connecting twice to get two replies, with a WebSocket interaction, where a client connects to a server once to get multiple replies.

Kommentar

Som beskrivs används HTTP-protokollet endast för att utföra ett handskakning när du upprättar en WebSocket-anslutning. När handskakningen har slutförts öppnas en WebSocket-anslutning för överföring av data och Web Application Firewall (WAF) kan inte parsa något innehåll. Därför utför WAF inga inspektioner av sådana data.

Listener-konfigurationselementet

En befintlig HTTP-lyssnare kan användas för att stödja WebSocket-trafik. Följande är ett kodfragment av ett httpListeners-element från en exempelmallfil. Du skulle behöva både HTTP- och HTTPS-lyssnare för att stödja WebSocket och skydda WebSocket-trafik. På samma sätt kan du använda portalen eller Azure PowerShell för att skapa en programgateway med lyssnare på port 80/443 för att stödja WebSocket-trafik.

"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",
            }
        }
    ],

Konfiguration av backendAddressPool, BackendHttpSetting och routningsregel

En BackendAddressPool används för att definiera en serverdelspool med WebSocket-aktiverade servrar. ServerdelenHttpSetting definieras med serverdelsporten 80 och 443. Tidsgränsvärdet för begäran i HTTP-Inställningar gäller även för WebSocket-sessionen. Det krävs ingen ändring i routningsregeln, som används för att koppla lämplig lyssnare till motsvarande serverdelsadresspool.

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

    }
}]

Kommentar

Kontrollera att timeout-värdet är större än det serverdefinierade ping-/pong-intervallet för att undvika timeout-fel innan en ping skickas från klienten. Ett typiskt värde för en WebSocket är 20 sekunder, så till exempel säkerställer ett timeout-värde på 40 sekunder att gatewayen inte skickar ett timeout-fel innan klienten skickar en ping. annars skulle detta utlösa ett 1006-fel på klientsidan.

WebSocket-aktiverad serverdel

Serverdelen måste ha en HTTP/HTTPS-webbserver som körs på den konfigurerade porten (vanligtvis 80/443) för att WebSocket ska fungera. Det här kravet beror på att WebSocket-protokollet kräver att den inledande handskakningen är HTTP med uppgradering till WebSocket-protokollet som ett rubrikfält. Följande är ett exempel på en rubrik:

    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

En annan orsak till detta är att programgatewayens hälsoavsökning endast stöder HTTP- och HTTPS-protokoll. Om serverdelsservern inte svarar på HTTP- eller HTTPS-avsökningar tas den bort från serverdelspoolen.

Nästa steg

När du har lärt dig mer om WebSocket-stöd går du till skapa en programgateway för att komma igång med ett WebSocket-aktiverat webbprogram.