nginx-1.3.13

Maxim Dounin mdounin at mdounin.ru
Tue Feb 19 16:25:07 UTC 2013


Hello!

On Tue, Feb 19, 2013 at 08:02:06PM +0400, Михаил Монашёв wrote:

> Здравствуйте, Maxim.
> 
> >     *) Добавление: поддержка проксирования WebSocket-соединений.
> >        Спасибо Apcera и CloudBees за спонсирование разработки.
> 
> Посмотрел комит http://trac.nginx.org/nginx/changeset/5073/nginx , но
> не понял всю схему того, как оно работает. Обновляется соединение
> между nginx и бэкендом что ли?

Short version:

Устанавливает тоннель между клиентом и бекендом.

Long version, чтобы два раза не вставать:

Вообще протокол WebSocket работает с помощью механизма Upgrade, 
присутствующего в HTTP/1.1, превращая соединение между клиентом и 
сервером из HTTP/1.1 в WebSocket.

Есть, однако, нюанс: этот hop-by-hop механизм, он в нормальных 
условиях не может проходить через proxy-сервера.  Для forward 
proxy в стандарте WebSocket есть затычка: клиентам предлагается 
использовать CONNECT, чтобы пройти через proxy-сервер без потерь 
(тот же CONNECT используется для того, чтобы через forward proxy 
можно было ходить на https-ресурсы).  Но с reverse proxy такой 
подход не работает, т.к. клиент о proxy вообще не знает, и 
требуется специальная обработка.

В вышеупомянтом коммите - добавлен специальный режим работы, 
который позволяет nginx'у установить тунель между клиентом и 
бекендом, если бекенд прислал ответ 101 Switching Protocols (и 
если клиент действительно хотел upgrade'ить соединение).

Следует иметь ввиду, что по умолчанию nginx убирает из запроса на 
бекенд hop-by-hop заголовки Upgrade и Connection, так что для 
того, чтобы бекенд узнал, что клиент хотел upgrade'ить соединение, 
эти заголовки надо явно пробросить.  Пример конфигурации из 
собственно коммит-лога:

    location /chat/ {
        proxy_pass http://backend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

Как-то так.

-- 
Maxim Dounin
http://nginx.com/support.html



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