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

Maxim Dounin mdounin на mdounin.ru
Вт Ноя 28 14:25:14 UTC 2017


Hello!

On Tue, Nov 28, 2017 at 07:04:05PM +0500, Илья Шипицин wrote:

> 28 ноября 2017 г., 18:42 пользователь Maxim Dounin <mdounin at mdounin.ru>
> написал:
> 
> > 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.  Подробнее об этом
> > рассказано тут:
> 
> собственно, в примере про вебсокеты у вас:
> 
> proxy_http_version 1.1;

И этого, очевидно, недостаточно.

> > 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