應用程式閘道中的 WebSocket 支援概觀
應用程式閘道可跨所有閘道大小對 WebSocket 提供原生支援。 使用者無法進行設定來選擇要啟用或停用 WebSocket 支援。
以 RFC6455 標準化的 WebSocket 通訊協定可透過長時間執行的 TCP 連線讓伺服器和用戶端之間能夠進行全雙工通訊。 此功能可讓 Web 伺服器和用戶端之間進行互動性更高的通訊,此通訊可以是雙向的,而不需要像 HTTP 型實作所要求的進行輪詢。 不同於 HTTP,WebSocket 的負荷很低,而且可以對多個要求/回應重複使用相同的 TCP 連線,進而提升資源使用效率。 WebSocket 通訊協定設計為透過傳統 HTTP 連接埠 80 和 443 進行運作。
您可以在連接埠 80 或 443 上繼續使用標準 HTTP 接聽程式來接收 WebSocket 流量。 WebSocket 流量接著會使用應用程式閘道規則中指定的適當後端集區,來導向到已啟用 WebSocket 的後端伺服器。 後端伺服器必須回應應用程式閘道探查,健康情況探查概觀一節中會有所說明。 應用程式閘道健康情況探查僅限使用 HTTP/HTTPS。 每一部後端伺服器都必須回應 HTTP 探查,應用程式閘道才能將 WebSocket 流量路由傳送至伺服器。
它用於受益於快速且即時通訊的應用程式,例如聊天、儀表板和遊戲應用程式。
WebSocket 的運作方式
若要建立 WebSocket 連線,用戶端和伺服器之間會交換以 HTTP 為基礎的特定交握。 如果成功,應用程式層通訊協定會從 HTTP「升級」為 WebSocket,使用先前建立的 TCP 連線。 當發生這種情形時,HTTP 會完全退場;端點使用 WebSocket 通訊協定傳送或接收資料,直到 WebSocket 連線關閉為止。
注意
將連線升級至 WebSocket 之後,作為中繼/終止 Proxy,應用程式閘道 只會將從前端接收的數據傳送至後端,反之亦然,而不需要任何檢查或操作功能。 因此,Web 應用程式防火牆 (WAF) 無法剖析任何內容,也不會對這類數據執行任何檢查。 同樣地,在建立 WebSocket 連線之後,將不會套用任何操作,例如標頭重寫、URL 重寫或覆寫後端設定中的主機名。
接聽程式組態元素
現有的 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 和路由規則組態
若後端集區具有已啟用 WebSocket 的伺服器,使用 backendAddressPool 加以定義。 backendHttpSetting 是以後端連接埠 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 Web 伺服器,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 的 Web 應用程式。