[英]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.