Application Gateway'de WebSocket desteğine genel bakış

Application Gateway, tüm ağ geçidi boyutlarında WebSocket için yerel destek sağlar. WebSocket desteğini isteğe bağlı olarak etkinleştirmek veya devre dışı bırakmak için kullanıcı tarafından yapılandırılabilen bir ayar yoktur.

RFC6455'de standartlaştırılmış WebSocket protokolü, uzun süre çalışan bir TCP bağlantısı üzerinden sunucu ile istemci arasında tam çift yönlü iletişim sağlar. Bu özellik web sunucusu ile istemci arasında daha etkileşimli bir iletişim sağlar. Bu, HTTP tabanlı uygulamalarda gerektiği gibi yoklama gerektirmeden çift yönlü olabilir. WebSocket,HTTP'den farklı olarak düşük ek yüke sahiptir ve aynı TCP bağlantısını birden çok istek/yanıt için yeniden kullanabilir ve kaynakların daha verimli kullanılmasına neden olabilir. WebSocket protokolleri, 80 ve 443'ün geleneksel HTTP bağlantı noktaları üzerinde çalışacak şekilde tasarlanmıştır.

WebSocket trafiğini almak için 80 veya 443 numaralı bağlantı noktasında standart bir HTTP dinleyicisi kullanmaya devam edebilirsiniz. WebSocket trafiği daha sonra uygulama ağ geçidi kurallarında belirtildiği gibi uygun arka uç havuzu kullanılarak WebSocket etkin arka uç sunucusuna yönlendirilir. Arka uç sunucusunun, sistem durumu yoklamasına genel bakış bölümünde açıklanan uygulama ağ geçidi yoklamalarına yanıt vermesi gerekir. Uygulama ağ geçidi sistem durumu yoklamaları yalnızca HTTP/HTTPS'dir. WebSocket trafiğini sunucuya yönlendirmek için her arka uç sunucusunun uygulama ağ geçidi için HTTP yoklamalarına yanıt vermesi gerekir.

Sohbet, pano ve oyun uygulamaları gibi hızlı, gerçek zamanlı iletişimden yararlanan uygulamalarda kullanılır.

WebSocket nasıl çalışır?

WebSocket bağlantısı kurmak için istemci ile sunucu arasında belirli bir HTTP tabanlı el sıkışması değiştirilir. Başarılı olursa, uygulama katmanı protokolü daha önce oluşturulmuş TCP bağlantısı kullanılarak HTTP'den WebSockets'e "yükseltilir". Bu durum oluştuğunda HTTP tamamen resmin dışındadır; veriler, WebSocket bağlantısı kapatılana kadar her iki uç nokta tarafından WebSocket protokolü kullanılarak gönderilebilir veya alınabilir.

Diyagram, bir web sunucusuyla etkileşim kuran bir istemciyi karşılaştırır ve iki yanıt almak için iki kez bağlanır ve bir istemcinin birden çok yanıt almak için bir sunucuya bir kez bağlandığı Bir WebSocket etkileşimi vardır.

Not

Bir bağlantı WebSocket'e yükseltildikten sonra, ara sunucu/sonlandırıcı ara sunucu olarak Application Gateway herhangi bir inceleme veya işleme özelliği olmadan ön uçtan alınan verileri arka uca gönderir ve tam tersi de geçerlidir. Bu nedenle, Web Uygulaması Güvenlik Duvarı (WAF) herhangi bir içeriği ayrıştıramaz ve bu tür veriler üzerinde herhangi bir denetim gerçekleştirmez. Benzer şekilde, WebSocket bağlantısı kurulduktan sonra Üst Bilgi Yeniden Yazma, URL Yeniden Yazma veya Arka Uç Ayarlarında Ana Bilgisayar Adını Geçersiz Kılma gibi herhangi bir işleme uygulanmaz.

Dinleyici yapılandırma öğesi

WebSocket trafiğini desteklemek için mevcut bir HTTP dinleyicisi kullanılabilir. Aşağıda, örnek şablon dosyasından bir httpListeners öğesinin kod parçacığı verilmiştir. WebSocket'i desteklemek ve WebSocket trafiğinin güvenliğini sağlamak için hem HTTP hem de HTTPS dinleyicilerine ihtiyacınız olacaktır. Benzer şekilde portalı veya Azure PowerShell'i kullanarak WebSocket trafiğini desteklemek üzere 80/443 numaralı bağlantı noktasında dinleyicilerle bir uygulama ağ geçidi oluşturabilirsiniz.

"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, Arka UçHttpSetting ve Yönlendirme kuralı yapılandırması

BackendAddressPool, WebSocket özellikli sunucularla bir arka uç havuzu tanımlamak için kullanılır. Arka uçHttpSetting, arka uç bağlantı noktası 80 ve 443 ile tanımlanır. HTTP Ayarları'ndaki istek zaman aşımı değeri, WebSocket oturumu için de geçerlidir. Uygun dinleyiciyi ilgili arka uç adres havuzuna bağlamak için kullanılan yönlendirme kuralında değişiklik gerekmez.

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

    }
}]

Not

İstemciden bir ping gönderilmeden önce zaman aşımı hatalarıyla karşılaşmamak için zaman aşımı değerinizin sunucu tanımlı ping/pong aralığınızdan büyük olduğundan emin olun. WebSocket için tipik bir değer 20 saniyedir, dolayısıyla örneğin, 40 saniyelik bir zaman aşımı değeri, istemci ping göndermeden önce ağ geçidinin zaman aşımı hatası göndermemesini sağlar; aksi takdirde, bu istemci tarafında bir 1006 hatası oluşturur.

WebSocket etkin arka uç

WebSocket'in çalışması için arka uçta yapılandırılmış bağlantı noktasında (genellikle 80/443) çalışan bir HTTP/HTTPS web sunucusu olmalıdır. Bunun nedeni, WebSocket protokolunun ilk el sıkışmasının üst bilgi alanı olarak WebSocket protokolüne yükseltme ile HTTP olmasını gerektirmesidir. Aşağıda bir üst bilgi örneği verilmiştir:

    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

Bunun bir diğer nedeni de uygulama ağ geçidi arka uç sistem durumu yoklamasının yalnızca HTTP ve HTTPS protokollerini desteklemesidir. Arka uç sunucusu HTTP veya HTTPS yoklamalarına yanıt vermezse arka uç havuzundan çıkarılır.

Sonraki adımlar

WebSocket desteği hakkında bilgi edindikten sonra, WebSocket özellikli bir web uygulamasını kullanmaya başlamak için bir uygulama ağ geçidi oluşturmaya gidin.