Re: как правильно проксировать вебсокеты ?

Maxim Dounin mdounin на mdounin.ru
Вт Ноя 28 13:42:59 UTC 2017


Hello!

On Tue, Nov 28, 2017 at 12:46:53PM +0500, Илья Шипицин wrote:

> Привет!
> 
> в официальной документации https://nginx.ru/ru/docs/http/websocket.html
> 
> есть пример
> 
>     map $http_upgrade $connection_upgrade {
>         default upgrade;
>         ''      close;
>     }
> 
> 
> получается, что соединение будет закрываться каждый раз.
> 
> не будет ли логичнее сделать
> 
>     map $http_upgrade $connection_upgrade {
>         default upgrade;
>         ''      '';
>     }
> 
> ?
> 
> или это какая-то задумка ? расскажите ?

По умолчанию соединения к бэкенду используют HTTP/1.0 и 
закрываются каждый раз.  Если хочется, чтобы они не закрывались, 
нужно явно сказать nginx'у, чтобы использовал HTTP/1.1 и не 
отправлял на бэкенд "Connection: close", а также включить кэш 
keepalive-соединений в блоке upstream.  Подробнее об этом 
рассказано тут:

http://nginx.org/ru/docs/http/ngx_http_upstream_module.html#keepalive

Если хочется использовать keepalive к бэкендам одновременно с 
проксированием вебсокетов - то пример в статье про проксирование 
вебсокетов, естественно, не будет работать как есть, в нём надо 
"close" заменить на пустую строку - как и предложено выше.

Однако если это сделать без включения кэша keepalive-соединений, 
то никаких положительных последствий не будет.  Наоборот, появится 
лишняя задержка перед закрытием соединения, и закрывать соединения 
будет nginx, а не бэкенд, что в свою очередь может привести к 
проблемам, так как time-wait сокеты вместо стороны бэкенда 
окажутся на стороне nginx'а.

-- 
Maxim Dounin
http://mdounin.ru/


Подробная информация о списке рассылки nginx-ru