我有一个带有WebSocketHandler的Tornado服务器,当我连接到localhost上的处理程序时,一切正常。但是,服务器正在移动到新环境,现在必须在wss
而不是ws
协议上运行。自从迁移到新环境后,与WebSocketHandler的所有客户端连接都会超时而不会打开。然而,telnet
连接得很好。问题出现在所有主流浏览器中,afaik。
防火墙对我的服务器运行的端口有一个例外,我通过发送我的.cer
和.key
文件在Tornado服务器中启用了TLS,但无济于事。我也尝试在同一环境中运行的Apache服务器中遵循关于ProxyPass的建议here,并且连接仍然超时。
环境: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>");
任何帮助将不胜感激!
答案 0 :(得分:0)
问题出在ProxyPass设置和我的wss
网址中使用的帖子。
龙卷风更新:
从Tornado配置中删除了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将这些请求隧道传输到Tornado服务器。所以只需从url中删除端口(或添加Apache的端口号)
var ws = new Websocket("wss://my-domain/resource/<resource_id>");
这三个变化就是诀窍!希望这对于遇到同样问题的其他人都有帮助。