Přehled podpory protokolu WebSocket ve službě Application Gateway

Application Gateway poskytuje nativní podporu protokolu WebSocket ve všech velikostech brány. Neexistuje žádné uživatelsky konfigurovatelné nastavení pro selektivní povolení nebo zakázání podpory protokolu WebSocket.

Protokol WebSocket standardizovaný v RFC6455 umožňuje úplnou duplexní komunikaci mezi serverem a klientem přes dlouhotrvající připojení TCP. Tato funkce umožňuje interaktivnější komunikaci mezi webovým serverem a klientem, což může být obousměrné bez nutnosti dotazování podle požadavků v implementacích založených na protokolu HTTP. Protokol WebSocket má nízkou režii na rozdíl od protokolu HTTP a může opakovaně používat stejné připojení TCP pro více požadavků a odpovědí, což vede k efektivnějšímu využití prostředků. Protokoly WebSocket jsou navržené tak, aby fungovaly přes tradiční porty HTTP 80 a 443.

K příjmu provozu Protokolu WebSocket můžete dál používat standardní naslouchací proces HTTP na portu 80 nebo 443. Provoz Protokolu WebSocket se pak přesměruje na back-endový server s povoleným webSocketem pomocí příslušného back-endového fondu, jak je uvedeno v pravidlech služby Application Gateway. Back-endový server musí reagovat na sondy služby Application Gateway, které jsou popsány v části přehledu sond stavu. Sondy stavu služby Application Gateway jsou pouze HTTP/HTTPS. Každý back-endový server musí reagovat na testy HTTP, aby služba Application Gateway směroval provoz Protokolu WebSocket na server.

Používá se v aplikacích, které využívají rychlou komunikaci v reálném čase, jako je chat, řídicí panel a herní aplikace.

Jak funguje WebSocket

K navázání připojení WebSocket se mezi klientem a serverem vyměňuje konkrétní metoda handshake založená na protokolu HTTP. V případě úspěchu se protokol aplikační vrstvy upgraduje z HTTP na WebSockets pomocí dříve vytvořeného připojení TCP. Jakmile k tomu dojde, HTTP je zcela mimo obrázek; data lze odesílat nebo přijímat pomocí protokolu WebSocket oběma koncovými body, dokud se připojení WebSocket neuzavře.

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.

Poznámka:

Jak je popsáno, protokol HTTP se používá pouze k provedení metody handshake při navazování připojení WebSocket. Po dokončení metody handshake se otevře připojení WebSocket pro přenos dat a firewall webových aplikací (WAF) nemůže analyzovat žádný obsah. WaF proto na těchto datech neprovádí žádné kontroly.

Konfigurační prvek naslouchacího procesu

Existující naslouchací proces HTTP lze použít k podpoře provozu Protokolu WebSocket. Následuje fragment kódu elementu httpListeners z ukázkového souboru šablony. K podpoře protokolu WebSocket a zabezpečení provozu Protokolu WebSocket budete potřebovat naslouchací procesy HTTP i HTTPS. Podobně můžete pomocí portálu nebo Azure PowerShellu vytvořit aplikační bránu s naslouchacími procesy na portu 80/443 pro podporu provozu Protokolu WebSocket.

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

Konfigurace pravidla backendAddressPool, BackendHttpSetting a pravidla směrování

BackendAddressPool slouží k definování back-endového fondu se servery s povolenými webSockety. BackendHttpSetting je definovaný s back-endovým portem 80 a 443. Hodnota časového limitu požadavku v protokolu HTTP Nastavení platí také pro relaci Protokolu WebSocket. V pravidle směrování není nutná žádná změna, která slouží ke svázání příslušného naslouchacího procesu s odpovídajícím back-endovým fondem adres.

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

    }
}]

Poznámka:

Ujistěte se, že je hodnota časového limitu větší než interval ping/pong definovaný serverem, abyste se vyhnuli chybám časového limitu před odesláním příkazu ping z klienta. Typická hodnota protokolu WebSocket je 20 sekund, takže například hodnota časového limitu 40 sekund zajistí, že brána neodešle chybu časového limitu před odesláním příkazu ping klientem; jinak by se na straně klienta zobrazila chyba 1006.

Back-end s povoleným protokolem WebSocket

Aby back-end fungoval, musí mít webový server HTTP/HTTPS spuštěný na nakonfigurovaném portu (obvykle 80/443). Tento požadavek je způsoben tím, že protokol WebSocket vyžaduje, aby počáteční metodu handshake byla HTTP s upgradem na protokol WebSocket jako pole hlavičky. Následuje příklad hlavičky:

    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

Dalším důvodem je to, že back-endová sonda stavu služby Application Gateway podporuje pouze protokoly HTTP a HTTPS. Pokud back-endový server nereaguje na testy HTTP nebo HTTPS, dojde k jeho odebrání z back-endového fondu.

Další kroky

Jakmile se seznámíte s podporou protokolu WebSocket, přejděte na vytvoření aplikační brány , abyste mohli začít s webovou aplikací s povolenou webovou aplikací WebSocket.