Есть вебсервер lighttpd, который выдает относительно статическую вебстраницу. Этот lighttpd связан через FastCGI с модулем бизнес-логики на С++, т.е. вебстраницу по большому счету модуль С++ формирует.
На вебстранице есть джаваскрипт, который может устанавливать соединение по WebSocket-у. Есть сервер на вебсокетах, написанный на Qt (как часть модуля логики С++).
В принципе это все работает, но не устраивает тот факт, что Qt-шный вебсокет сервер торчит в сеть своим отдельным портом.
Необходимо сделать так, что бы клиент (браузер) соединялся с lighttpd по HTTPS и дальше при работе джаваскрипта проксировал WSS соединение на Qt-шный вебсокет сервер.
Вопросы:
1. Как проксировать вебсокет за вебсервер?
2. Как при этом должен работать Qt-шный вебсокет сервер, т.е. на каком порту и как сидеть — чего слушать? (что бы не торчал открытым портом в сеть).
3. Самое главное — необходима SSL авторизация одна по HTTPS, и что бы потом по вебсокету сертификаты не трогать.
4. Такое вообще возможно?
Т.е. нужен один канал связи HTTPS, который на вебсервере разветвлялся еще и на вебсокет.
PS: lighttpd в принципе можно заменить на что нибудь другое, главное, что бы была связь по FastCGI, т.к. вся логика вне вебсервера находится.
PPS: извините если коряво описал задачу, но с вебом, серверами и админством знаком мало.
Здравствуйте, Oxotnik, Вы писали:
O> 1. Как проксировать вебсокет за вебсервер?
Последние версии nginx научились поддерживать web-сокеты "из коробки".
O> 2. Как при этом должен работать Qt-шный вебсокет сервер, т.е. на каком порту и как сидеть — чего слушать? (что бы не торчал открытым портом в сеть).
В случае наличия проксирующего сервера бэкенд можно садить на любой порт (127.0.0.1:8080 например).
Здравствуйте, Anton Batenev, Вы писали:
AB>Здравствуйте, Oxotnik, Вы писали:
O>> 1. Как проксировать вебсокет за вебсервер?
AB>Последние версии nginx научились поддерживать web-сокеты "из коробки".
O>> 2. Как при этом должен работать Qt-шный вебсокет сервер, т.е. на каком порту и как сидеть — чего слушать? (что бы не торчал открытым портом в сеть).
AB>В случае наличия проксирующего сервера бэкенд можно садить на любой порт (127.0.0.1:8080 например).
Извините за глупые вопросы, но осмелюсь спросить:
1. Может ли nginx проксировать HTTPS соединение и внутри него WSS соединение в WS соединение?
2. Если не сможет, то будет ли по одному и тому же сертификату авторизовываться клиент по HTTPS и по WSS ?
Здравствуйте, Аноним, Вы писали:
> Извините за глупые вопросы, но осмелюсь спросить: > 1. Может ли nginx проксировать HTTPS соединение и внутри него WSS соединение в WS соединение? > 2. Если не сможет, то будет ли по одному и тому же сертификату авторизовываться клиент по HTTPS и по WSS ?
К сожалению, я не пробовал еще проксировать через nginx, однако, в теории, этому не должно быть никаких препятствий — SSL это всего лишь транспорт, а под ним может быть как HTTP так и WebSocket. Разные location в конфигурации nginx могу проксировать соединения на разные бэкенды (что подтверждается документацией).
После чего рекомендуется проверить настройки HTTPS на ssllabs.com.
Если в системе установлен openssl < 1.x (проверяется командой openssl version), то я бы собрал nginx c последней версией openssl. Строка конфигурации для сборки выглядит как-то так:
Профит будет заключаться в поддержке TLSv1.1 и TLSv1.2 плюс на свой страх и риск можно будет убрать из ssl_ciphers опцию "RC4" (современные браузеры не подвержены BEAST attack).