應用程式閘道中的 WebSocket 支援概觀

應用程式閘道可跨所有閘道大小對 WebSocket 提供原生支援。 沒有使用者可設定的設定可選擇性地啟用或停用 WebSocket 支援。

以 RFC6455 標準化的 WebSocket 通訊協定可透過長時間執行的 TCP 連線讓伺服器和用戶端之間能夠進行全雙工通訊。 此功能可讓 Web 伺服器和用戶端之間進行互動性更高的通訊,此通訊可以是雙向的,而不需要像 HTTP 型實作所要求的進行輪詢。 不同於 HTTP,WebSocket 的負荷很低,而且可以對多個要求/回應重複使用相同的 TCP 連線,進而提升資源使用效率。 WebSocket 通訊協定設計為透過傳統 HTTP 連接埠 80 和 443 進行運作。 應用程式閘道每個實例最多支援 30,000 個並行 WS 連線和 13,500 個 WSS 連線。

您可以在連接埠 80 或 443 上繼續使用標準 HTTP 接聽程式來接收 WebSocket 流量。 WebSocket 流量接著會使用應用程式閘道規則中指定的適當後端集區,來導向到已啟用 WebSocket 的後端伺服器。 後端伺服器必須回應應用程式閘道的探查,如 健康探查概觀 一節所述。 應用程式閘道健康情況探查僅限使用 HTTP/HTTPS。 每台後端伺服器都必須回應 HTTP 探查,應用程式閘道才能將 WebSocket 流量路由至該伺服器。

它用於受益於快速且即時通訊的應用程式,例如聊天、儀表板和遊戲應用程式。

WebSocket 的運作方式

若要建立 WebSocket 連線,用戶端和伺服器之間會交換以 HTTP 為基礎的特定交握。 如果成功,應用程式層通訊協定會從 HTTP「升級」為 WebSocket,使用先前建立的 TCP 連線。 當發生這種情形時,HTTP 會完全退場;端點使用 WebSocket 通訊協定傳送或接收資料,直到 WebSocket 連線關閉為止。

圖表會比較與網頁伺服器互動的用戶端,連接兩次以取得兩個回復,以及 WebSocket 互動,其中用戶端一次連線到伺服器以取得多個回復。

注意

連線升級至 WebSocket 後,作為中介/終止代理,Application Gateway 只需將從前端接收的資料傳送到後端,反之亦然,無需檢查或操作功能。 因此,Web 應用程式防火牆(WAF)無法解析任何內容,也不會對這些資料進行檢查。 同樣地,任何像是標頭重寫、URL 重寫或後端設定中覆寫主機名稱等操作,在建立 WebSocket 連線後都不適用。

接聽器組態元素

現有的 HTTP 接聽程式可用來支援 WebSocket 流量。 以下片段展示了範例範本檔案中的一個 httpListeners 元素。 你需要同時有 HTTP 和 HTTPS 監聽器來支援 WebSocket 並保護 WebSocket 流量。 同樣地,你可以用入口網站或 Azure PowerShell 建立一個應用程式閘道,並在 80 和 443 埠設置監聽器,以支援 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",
            }
        }
    ],

BackendAddressPool、BackendHttpSetting 和路由規則組態

使用 BackendAddressPool 來定義一個包含 WebSocket 啟用伺服器的後端池。 定義後端 HttpSetting ,後端埠號為 80 和 443。 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/Pong 間隔,以避免在從用戶端傳送 Ping 之前發生逾時錯誤。 WebSocket 的典型值為 20 秒,例如逾時值為 40 秒,確保閘道器不會在用戶端發送 ping 前發送逾時錯誤。 否則,此條件會在用戶端丟出 1006 錯誤。

支援 WebSocket 的後端

你的後端必須在設定的埠口(通常是 80 或 443)上運行 HTTP/HTTPS 網頁伺服器,WebSocket 才能運作。 此要求存在是因為 WebSocket 協定要求初始握手必須為 HTTP,並升級至 WebSocket 協定作為標頭欄位。 以下範例顯示標頭:

    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

另一個原因是應用閘道後端健康探測僅支援 HTTP 和 HTTPS 協定。 如果後端伺服器對 HTTP 或 HTTPS 探測沒有回應,閘道器會將其從後端池中移除。

下一步

了解 WebSocket 支援後,請建立 應用程式閘道 ,開始使用支援 WebSocket 的網頁應用程式。