Ö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.
Kommentar
När en anslutning har uppgraderats till WebSocket, som mellanhand/avslutande proxy, skickar Application Gateway helt enkelt de data som tas emot från klientdelen till serverdelen och vice versa, utan någon kontroll- eller manipulationsfunktion. Därför kan brandväggen för webbaserade program (WAF) inte parsa innehåll och utför inga inspektioner av sådana data. På samma sätt gäller inte alla manipulationer som sidhuvudomskrivningar, URL-omskrivningar eller åsidosättande värdnamn i serverdelsinställningarna när en WebSocket-anslutning har upprättats.
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.