2016-08-18 14 views
1

WebSocketHandlerを持つTornadoサーバーがあり、localhostのハンドラーに接続するとすべて正常に動作します。ただし、サーバーは新しい環境に移動され、wsプロトコルの代わりにwssで実行する必要があります。新しい環境に移行して以来、私のWebSocketHandlerへのすべてのクライアント接続は、開かずにタイムアウトします。しかし、telnetはうまく接続します。この問題はすべての主要なブラウザafaikで発生します。WebSocketクライアント接続がTornadoサーバーとの接続を開こうとするとタイムアウトする

ファイアウォールでは、私のサーバーが稼働しているポートの例外があり、Tornadoサーバーで.cer.keyのファイルを送信することでTLSを有効にしましたが、役に立たなくなりました。また、同じ環境で動作しているApacheサーバーのProxyPassに関するアドバイスhereを試してみましたが、接続はまだタイムアウトしています。

環境:

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>"); 

どれ:CentOSのLinuxは1511年7月2日

関連トルネードコードを公開助けていただければ幸いです!

答えて

0

問題はProxyPass設定で、投稿は私のwss urlで使用されていました。

トルネード更新:トルネード構成から

のSSL証明書とキーファイルを除去しました。

はProxyPassアップデート:場所に証明書を保つことによって、私はおそらくwssを使用することもできましたけれども

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> 

二番目の引数は、(ws://wss://から変更)非SSLプロトコルでなければなりません。しかし、これは問題ではありませんが、ApacheはWebSocketの受信リクエストをサーバーにキャッチします。

クライアントアップデート:

その後、クライアントは、トルネードサーバーにそれらをトンネリングのApacheにリクエストを送信する必要があります。したがって、URLからポートを削除する(またはApacheのポート番号を追加する)

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

これら3つの変更がトリックでした!うまくいけば、これは同じ問題を抱えている他の誰にとっても役に立ちます。

関連する問題