Gambaran umum dukungan WebSocket di Application Gateway

Application Gateway menyediakan dukungan asli untuk WebSocket di semua ukuran gateway. Tidak ada setelan yang bisa dikonfigurasi pengguna untuk mengaktifkan atau menonaktifkan dukungan WebSocket secara selektif.

Protokol WebSocket yang distandardisasi di RFC6455 mengaktifkan komunikasi dupleks penuh antara server dan klien melalui koneksi TCP yang berjalan lama. Fitur ini memungkinkan komunikasi yang lebih interaktif antara server web dan klien yang dapat berjalan dua arah tanpa perlu polling seperti yang diperlukan dalam implementasi berbasis HTTP. WebSocket memiliki overhead rendah tidak seperti HTTP dan dapat menggunakan kembali koneksi TCP yang sama untuk beberapa permintaan/respons yang menghasilkan pemanfaatan sumber daya yang lebih efisien. Protokol WebSocket dirancang untuk bekerja melalui port HTTP tradisional 80 dan 443.

Anda dapat terus menggunakan pendengar HTTP standar pada port 80 atau 443 untuk menerima lalu lintas WebSocket. Lalu lintas WebSocket kemudian diarahkan ke server ujung belakang yang diaktifkan WebSocket menggunakan kumpulan backend yang sesuai seperti yang ditentukan dalam aturan gateway aplikasi. Server ujung belakang harus menanggapi probe gateway aplikasi, yang dijelaskan di bagian gambaran umum pemeriksaan kesehatan. Pemeriksaan kesehatan gateway aplikasi hanya HTTP/HTTPS. Setiap server ujung belakang harus menanggapi probe HTTP agar gateway aplikasi merutekan lalu lintas WebSocket ke server.

Ini digunakan dalam aplikasi yang mendapat manfaat dari komunikasi yang cepat dan real time, seperti obrolan, dasbor, dan aplikasi game.

Cara kerja WebSocket

Untuk membuat koneksi WebSocket, jabat tangan berbasis HTTP tertentu ditukarkan antara klien dan server. Jika berhasil, protokol lapisan aplikasi "ditingkatkan" dari HTTP ke WebSocket, menggunakan koneksi TCP yang sebelumnya dibuat. Setelah ini terjadi, HTTP benar-benar keluar dari gambar; data dapat dikirim atau diterima menggunakan protokol WebSocket oleh kedua titik akhir, hingga koneksi WebSocket ditutup.

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.

Catatan

Seperti yang dijelaskan, protokol HTTP hanya digunakan untuk melakukan jabat tangan saat membuat koneksi WebSocket. Setelah jabat tangan selesai, koneksi WebSocket akan dibuka untuk mengirimkan data, dan Web Application Firewall (WAF) tidak dapat mengurai konten apa pun. Oleh karena itu, WAF tidak melakukan pemeriksaan apa pun pada data tersebut.

Elemen konfigurasi pendengar

Pendengar HTTP yang ada dapat digunakan untuk mendukung lalu lintas WebSocket. Berikut adalah cuplikan elemen httpListeners dari file template sampel. Anda memerlukan pendengar HTTP dan HTTPS untuk mendukung WebSocket dan mengamankan lalu lintas WebSocket. Demikian pula Anda dapat menggunakan portal atau Azure PowerShell untuk membuat gateway aplikasi dengan pendengar di port 80/443 untuk mendukung lalu lintas 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",
            }
        }
    ],

Konfigurasi aturan BackendAddressPool, BackendHttpSetting, dan Perutean

BackendAddressPool digunakan untuk menentukan kumpulan ujung belakang dengan server yang diaktifkan WebSocket. BackendHttpSetting ditentukan dengan port ujung belakang 80 dan 443. Nilai batas waktu permintaan di Setelan HTTP juga berlaku untuk sesi WebSocket. Tidak ada perubahan yang diperlukan dalam aturan perutean yang digunakan untuk mengikat pendengar yang sesuai dengan kumpulan alamat ujung belakang yang sesuai.

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

    }
}]

Catatan

Pastikan nilai batas waktu Anda lebih besar dari interval ping/pong yang ditentukan server Anda untuk menghindari mengalami kesalahan waktu habis sebelum ping dikirim dari klien. Nilai umum untuk WebSocket adalah 20 detik, jadi, misalnya, nilai batas waktu 40 detik akan memastikan bahwa gateway tidak mengirim kesalahan batas waktu sebelum klien mengirim ping; jika tidak, ini akan melemparkan kesalahan 1006 di sisi klien.

Ujung belakang yang diaktifkan WebSocket

Ujung belakang Anda harus memiliki server web HTTP/HTTPS yang berjalan pada port yang dikonfigurasi (biasanya 80/443) agar WebSocket berfungsi. Persyaratan ini karena protokol WebSocket memerlukan jabat tangan awal agar menjadi HTTP dengan peningkatan ke protokol WebSocket sebagai bidang header. Berikut adalah contoh header:

    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

Alasan lainnya adalah pemeriksaan kesehatan ujung belakang gateway aplikasi hanya mendukung protokol HTTP dan HTTPS. Jika server backend tidak merespons pemeriksaan HTTP atau HTTPS, server tersebut diambil dari kumpulan backend.

Langkah berikutnya

Setelah mempelajari tentang dukungan WebSocket, buka membuat gateway aplikasi untuk memulai dengan aplikasi web yang diaktifkan WebSocket.