應用程式閘道可跨所有閘道大小對 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 後,作為中介/終止代理,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 的網頁應用程式。