Тайм-аут соединений клиента WebSockets при попытке открыть соединение с сервером Tornado

У меня есть сервер Tornado с WebSocketHandler, и когда я подключаюсь к обработчику на localhost, все работает правильно. Однако сервер перемещается в новую среду и теперь должен работать на wss вместо ws протокол. После перехода в новую среду все клиентские подключения к моему WebSocketHandler истекают, и они никогда не открываются. telnet подключается просто отлично, однако. Проблема возникает во всех основных браузерах, afaik.

Брандмауэр имеет исключение для порта, на котором работает мой сервер, и я включил TLS на сервере Tornado, отправив в .cer а также .key файлы, но безрезультатно. Я также попытался следовать совету, касающемуся ProxyPass, на сервере Apache, работающем в той же среде, и время соединения по-прежнему истекло.

Среда: CentOS Linux выпуск 7.2.1511

Соответствующий код торнадо:

import tornado.websocket
import tornado.ioloop
import tornado.auth
import tornado.escape
import tornado.concurrent

class WSHandler(tornado.websocket.WebSocketHandler)
    def check_origin(self, origin):
        return True

    def open(self, arg1, arg2):
        self.stream.set_nodelay(True)
        self.arg2 = arg2
        self.write_message("Opened the connection")

class WSApp(tornado.web.Application):
    def __init__(self, arg1=None, arg2=None, handlers=None,
                 default_host='', transforms=None, **settings):
        print("Starting WSApp application")
    super(WSApp, self).__init__(handlers=handlers,
                                       default_host=default_host,
                                       transforms=transforms,
                                       **settings)

if __name__ == "__main__":
    settings = {
        "cookie_secret": b'om nom nom' # /s,
        "ssl_options": {
            "certfile": "path/to/certfile.cer",
            "keyfile": "path/to/keyfile.key"
    }

    application = AMQPWSTunnel(handlers=[
                                (r"/(resource)/(.+)", AMQPWSHandler)
                            ],
                            debug=True,
                            **settings)

    application.listen(8930)

    try:
        tornado.ioloop.IOLoop.current().start()
    except KeyboardInterrupt:
        application.shutdown()

Настройки ProxyPass

ProxyPass /resource/<resource_name> wss://127.0.0.1:8930/resource/<resource_name>
ProxyPassReverse /resource/<resource_name> wss://127.0.0.1:8930/resource/<resource_name>

WebSocket Connection

var ws = new Websocket("wss://my-domain:8930/resource/<resource_id>");

Любая помощь будет оценена!

1 ответ

Проблема была с настройками ProxyPass и постом, использованным в моем wss URL-адрес.

Обновление Торнадо:

Файлы сертификата и ключа ssl были удалены из конфигурации Tornado.

Обновление ProxyPass:

ProxyPass /resource/<resource_name> ws://127.0.0.1:8930/resource/<resource_name>
ProxyPassReverse /resource/<resource_name> ws://127.0.0.1:8930/resource/<resource_name>

Вторым аргументом должен быть протокол не-ssl (изменен с wss:// в ws://), хотя, сохраняя сертификат на месте, я, вероятно, мог бы использовать wss, Это не проблема, потому что Apache перехватывает входящие запросы WebSocket на мой сервер.

Обновление клиента:

Клиент должен отправлять запросы в Apache, который затем туннелирует их на сервер Tornado. Так что просто удалите порт из URL (или добавьте номер порта Apache)

var ws = new Websocket("wss://my-domain/resource/<resource_id>");

Эти три изменения сделали свое дело! Надеемся, что это полезно для всех, кто застрял в той же проблеме.

Другие вопросы по тегам