2016-08-18 7 views
1

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

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

Окружающая среда: CentOS Linux релиз 7.2.1511

Соответствующий Tornado Код:

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 Подключение

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

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

ответ

0

Проблема была с настройками ProxyPass и сообщением, используемым в моем wss url.

Торнадо Update:

сертификата SSL и ключевые файлы были удалены из конфигурации Торнадо.

ProxyPass Update:

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 на мой сервер.

Client Update:

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^