我有一个带有 WebSocketHandler 的 Tornado 服务器,当我连接到本地主机上的处理程序时,一切正常。但是,服务器正在移动到新环境,现在必须在 ws
而不是 ws
协议(protocol)上运行。自从搬到新环境后,所有与我的 WebSocketHandler 的客户端连接都没有打开就超时了。但是,telnet
连接正常。该问题出现在所有主流浏览器中,afaik。
防火墙对我的服务器运行的端口有一个异常(exception),我通过发送我的 .cer
和 .key
在 Tornado 服务器中启用了 TLS文件,但无济于事。我也尝试遵循建议 here关于在同一环境中运行的 Apache 服务器中的 ProxyPass,连接仍然超时。
环境:CentOS Linux release 7.2.1511
相关 Tornado 代码:
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
url 中使用的帖子。
Tornado 更新:
ssl 证书和 key 文件已从 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 协议(protocol)(从 wss://
更改为 ws://
),尽管通过保留证书我可能可以使用 wss
。不过,这不是问题,因为 Apache 会捕获到我的服务器的传入 WebSocket 请求。
客户端更新:
客户端必须向 Apache 发送请求,Apache 然后通过隧道将它们发送到 Tornado 服务器。所以只需从 url 中删除端口(或添加 Apache 的端口号)
var ws = new Websocket("wss://my-domain/resource/<resource_id>");
这三个变化起到了作用!希望这对遇到同样问题的其他人有所帮助。
关于python - 尝试打开与 Tornado 服务器的连接时,WebSockets 客户端连接超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39028935/