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