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