2016-08-18 62 views
1

我有一個帶有WebSocketHandler的Tornado服務器,並且當我連接到本地主機上的處理程序時,一切正常。但是,服務器正在遷移到新的環境,現在必須運行wss而不是ws協議。自遷移到新環境以來,所有到我的WebSocketHandler的客戶端連接都會超時而不會打開。然而,telnet連接就好了。這個問題發生在所有主流瀏覽器afaik。當試圖打開與龍捲風服務器的連接時WebSockets客戶端連接超時

防火牆有一個例外,我的服務器正在運行,我已經在Tornado服務器上啓用了TLS,通過發送我的.cer.key文件,但無濟於事。我也試着在關於在同一環境中運行的Apache服務器中使用ProxyPass的建議here,並且連接仍然超時。

環境:CentOS的Linux的發佈1511年7月2日

相關龍捲風代碼:

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中使用的帖子。

龍捲風更新:

的SSL證書和密鑰文件從龍捲風配置中刪除。

的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,然後他們隧道龍捲風服務器。因此,只需從網址中刪除端口(或添加Apache的端口號)

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

這三個更改的竅門!希望這對任何陷入同一問題的人都有幫助。

相關問題