python - 尝试打开与 Tornado 服务器的连接时,WebSockets 客户端连接超时

标签 python ssl websocket tornado proxypass

我有一个带有 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/

相关文章:

Python终端打开后报错

python - scipy.stats.zipf 中的参数是什么意思?

python - OpenCV断言失败,并带有负值

node.js - 发送 200 个响应 header 后 http 请求失败的方法

python - Pandas 从分解数据框中获取字符串标签

java - 通过自己的 Java 客户端通过 HTTPS/SSL 连接的问题

ssl - SSL固定(嵌入主机)和普通证书(由服务器提供)有什么区别

Apache 错误:地址已在使用中:make_sock:无法绑定(bind)到地址 [::]:443

javascript - 有没有一种方法可以加载模块化 HTML 片段而不必为每个片段触发 http 请求?

express - Mocha websocket 测试不会可靠地失败/通过