WebSockets客户端连接超时时,试图打开与龙卷风服务器的连接



我有一个带有WebSocketHandler的龙卷风服务器,当我连接到本地主机上的处理程序时,一切正常工作。但是,服务器被转移到一个新的环境,现在必须在wss而不是ws协议上运行。迁移到新环境后,所有到WebSocketHandler的客户端连接都超时了,没有打开。然而,telnet连接得很好。这个问题可能在所有主流浏览器中都存在。

防火墙对我的服务器运行的端口有一个例外,并且我通过发送我的.cer.key文件在Tornado服务器中启用了TLS,但无济于事。我也试着遵循这里关于ProxyPass的建议在Apache服务器上运行在相同的环境中,连接仍然超时。

环境:CentOS Linux release 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 url中使用的post。

龙卷风更新:

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发送请求,然后Apache通过隧道将请求发送到Tornado服务器。因此,只需从url中删除端口(或添加Apache的端口号)

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

这三个变化奏效了!

相关内容

  • 没有找到相关文章

最新更新