簡體   English   中英

嘗試使用Tornado Server打開連接時WebSockets客戶端連接超時

[英]WebSockets Client Connections Time Out When Trying to Open a Connection with Tornado Server

我有一個帶有WebSocketHandler的Tornado服務器,當我連接到localhost上的處理程序時,一切正常。 但是,服務器正在移動到新環境,現在必須運行wss而不是ws協議。 自從遷移到新環境后,與WebSocketHandler的所有客戶端連接都會超時而不會打開。 然而, telnet接通很好。 這個問題出現在所有主要的瀏覽器中,afaik。

防火牆對我的服務器運行的端口有一個例外,我通過發送我的.cer.key文件在Tornado服務器中啟用了TLS,但無濟於事。 我也嘗試按照這里關於在同一環境中運行的Apache服務器中的ProxyPass的建議,並且連接仍然超時。

環境: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連接

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

任何幫助,將不勝感激!

問題在於ProxyPass設置和我的wss網址中使用的帖子。

龍卷風更新:

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

這三個變化成功了! 希望這對任何困擾同一問題的人都有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM