ΠŸΡ€ΠΎΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ WebSocket

Для прСвращСния соСдинСния ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром ΠΈΠ· HTTP/1.1 Π² WebSocket ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ доступный Π² HTTP/1.1 ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ смСны ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°.

Но Π΅ΡΡ‚ΡŒ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ β€œUpgrade” являСтся hop-by-hop Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ, Ρ‚ΠΎ ΠΎΠ½ Π½Π΅ пСрСдаётся ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΊ проксируСмому сСрвСру. ΠŸΡ€ΠΈ прямом проксировании ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ CONNECT, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. Однако ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ проксировании Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΎ ΠΏΡ€ΠΎΠΊΡΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ сСрвСрС Π½Π΅ Π·Π½Π°Π΅Ρ‚, ΠΈ трСбуСтся ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΡ€ΠΎΠΊΡΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ сСрвСрС.

Начиная с вСрсии 1.3.13 Π² nginx прСдусмотрСн особый Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚ΡƒΠ½Π½Π΅Π»ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ проксируСмым сСрвСром, Ссли проксируСмый сСрвСр Π²Π΅Ρ€Π½ΡƒΠ» ΠΎΡ‚Π²Π΅Ρ‚ с ΠΊΠΎΠ΄ΠΎΠΌ 101 (Switching Protocols), ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ попросил ΡΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° β€œUpgrade” Π² запросС.

Как ΡƒΠΆΠ΅ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, hop-by-hop Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ β€œUpgrade” ΠΈ β€œConnection”, Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΊ проксируСмому сСрвСру, поэтому, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ проксируСмый сСрвСр ΡƒΠ·Π½Π°Π» ΠΎ Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΡΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π½Π° WebSocket, эти Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ слСдуСт ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ явно:

location /chat/ {
    proxy_pass http://backend;
    # proxy_http_version 1.1; # Π΄ΠΎ вСрсии 1.29.7
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

Π‘ΠΎΠ»Π΅Π΅ слоТный ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля β€œConnection” Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ запроса ΠΊ проксируСмому сСрвСру зависит ΠΎΡ‚ наличия поля β€œUpgrade” Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ запроса ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°:

http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

    server {
        ...

        location /chat/ {
            proxy_pass http://backend;
            # proxy_http_version 1.1; # Π΄ΠΎ вСрсии 1.29.7
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    }

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ соСдинСниС Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎ, Ссли с проксируСмого сСрвСра Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π»ΠΈΡΡŒ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ 60 сСкунд. Π­Ρ‚ΠΎΡ‚ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ proxy_read_timeout. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½Π° проксируСмом сСрвСрС ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ WebSocket ping-Ρ„Ρ€Π΅ΠΉΠΌΠΎΠ² для сброса Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Π° ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ работоспособности соСдинСния.