Russian Qt Forum

Программирование => Общий => Тема начата: RedDog от Март 07, 2013, 12:55



Название: WebSocket + WebServer проксирование
Отправлено: RedDog от Март 07, 2013, 12:55
Надо реализовать такую схему:
Клиент (веб-браузер) подключается к веб-серверу по HTTPS, после загрузки страницы
клиент подключается по WebSocket с использованием того же канала HTTPS.
Т.е. необходимо одним сертификатом авторизироваться для HTTPS и WSS, и это должен быть один канал связи.
Веб сервер связывается с самописным (на С++) сервером по FastCGI.
Как можно реализовать вебсокет по одному каналу?
И как такое вообще можно провернуть?


Название: Re: WebSocket + WebServer проксирование
Отправлено: alexis031182 от Март 07, 2013, 17:43
Разве открывается отдельное соединение для WS и WSS? По стандарту, вроде, должен использоваться тот же канал, просто осуществляется согласованный переход с одного протокола на другой.


Название: Re: WebSocket + WebServer проксирование
Отправлено: RedDog от Март 07, 2013, 20:51
Разве открывается отдельное соединение для WS и WSS? По стандарту, вроде, должен использоваться тот же канал, просто осуществляется согласованный переход с одного протокола на другой.
Я у себя реализовал схему такую (пока без ССЛ):
Поднял веб-сервер lighttpd, который по запросу выдает статическую страничку html с джаваскриптом, последний в свою очередь открывает веб-сокет на 1177 порту.
На этой же машине запустил сервер веб-сокетов (написанный на Qt). Все подключается и работает, но очень сильные сомнения, в том, что по одному каналу веб-сервер и веб-сокет работают.
Сейчас проверить не могу (на работе проект остался), но сдается мне, что если html страничку загружать не с сервера, а из файла, то в принципе картина работоспособности не поменяется, т.е. веб-сокет так же создастся, т.о. http соединение в этом случае ни при чем.
В общем вопрос трансформируется в следующий: как спроксировать этот веб сокет через веб-сервер lighttpd, таким образом, что бы сервер веб-сокета находился за вебсервером и не торчал отдельным портом в общую сеть?


Название: Re: WebSocket + WebServer проксирование
Отправлено: alexis031182 от Март 07, 2013, 21:29
Я у себя реализовал схему такую (пока без ССЛ):
Поднял веб-сервер lighttpd, который по запросу выдает статическую страничку html с джаваскриптом, последний в свою очередь открывает веб-сокет на 1177 порту.
Я вероятно чего-то не понимаю. Зачем открывать новое соединение, если можно использовать текущее на 80 порту? WebSockets - это просто переключение языка общения между клиентом и сервером. Этот протокол и был создан для того, чтобы исключить необходимость в постоянном открытии новых соединений для проверки изменения данных и т.п. задач. Используется текущее открытое. Не отправляются заголовки. Сервер имеет возможность сообщить клиенту об изменении данных. То есть браузер и веб-сервер начинать работать на 80 порту как обычные сетевые приложения.

На этой же машине запустил сервер веб-сокетов (написанный на Qt). Все подключается и работает, но очень сильные сомнения, в том, что по одному каналу веб-сервер и веб-сокет работают.
А ну так-то конечно. У Вас как бы два сервера получается. Естественно, раз организуется новое соединение, тогда и авторизацию необходимо проходить по новой.

Сейчас проверить не могу (на работе проект остался), но сдается мне, что если html страничку загружать не с сервера, а из файла, то в принципе картина работоспособности не поменяется, т.е. веб-сокет так же создастся, т.о. http соединение в этом случае ни при чем.
Ну да. Ваш вебсервер должен быть одним приложением, чтобы заработало то, что Вы задумали.

В общем вопрос трансформируется в следующий: как спроксировать этот веб сокет через веб-сервер lighttpd, таким образом, что бы сервер веб-сокета находился за вебсервером и не торчал отдельным портом в общую сеть?
Вряд ли lighttpd умеет такое, а именно он должен это делать. С другой стороны, это всё равно будет новое отдельное соединение, пусть и между lighttpd и сервером веб-сокетов.


Название: Re: WebSocket + WebServer проксирование
Отправлено: RedDog от Март 07, 2013, 22:07
В принципе lighttpd не так важен, можно другой сервер.
Мне важно, что WebSocket не был отдельным подключением, а допустим по адресу https://localhost была статическая вебстраница, а по адресу https://localhost/websock сервер проксировал бы соединение на мой отдельный сервер.
Вот тут то я как раз и теряюсь - как его поднять, без указания дополнительно порта, ибо на 443 он уже из за вебсервера не поднимется.


Название: Re: WebSocket + WebServer проксирование
Отправлено: alexis031182 от Март 07, 2013, 22:16
Вы разделяете HTTP и WebSockets между собой, что наверное не совсем верно с учётом того, что Вам нужно сохранить однажды открытое соединение. Это означает, что Ваш сервер веб-сокетов должен быть одновременно и http-сервером.


Название: Re: WebSocket + WebServer проксирование
Отправлено: RedDog от Март 07, 2013, 22:56
Внезапно пришла такая мысль:
повесить свой Qt WebSocket сервер на локальный порт, т.е.  что то типа такого:
Код:
QTcpServer::listen(QHostAddress::LocalHost, 9999);
А http сервер настроить, что бы он адрес https://SomeHost принимал на себя, а адрес https://SomeHost/websocket проксировал на свой локалхост на порт 9999. Тогда половина вопроса будет решена (торчать в сеть ничего лишнего не будет).
Остается только выяснить, может ли какой либо веб-сервер (который поддерживает еще к тому же FastCGI) пробрасывать таким макаром соединение.


Название: Re: WebSocket + WebServer проксирование
Отправлено: alexis031182 от Март 07, 2013, 22:59
nginx наверное может.