【问题标题】:Why websocket don't work on the cloud?为什么 websocket 不能在云上运行?
【发布时间】:2014-07-18 07:28:23
【问题描述】:

我在 Wildfly 上开发了我们的 websocket 项目。当我们在 localhost 或本地网络中对其进行测试时,一切正常。但是当我在 AWS 上部署它时,websocket 不再工作了。我们可以访问其他html页面。但是当我们连接到“ws://ip/project location”时,chrome只会说握手错误。我在jelastic托管上也遇到过同样的网络套接字问题。我的问题是

  1. 为什么会这样?
  2. websocket 协议不够稳定?
  3. 有没有合适的java托管websocket项目?

【问题讨论】:

  • Websockets 是服务器运行的操作系统以及浏览器的问题。如果您在较旧的服务器上运行您的站点(我确信 AWS 提供较旧和较新的服务器),这可以解释它。当我说“老”时,我的意思是老不了多少。在 Windows 方面,我认为 Server 2008 R2 甚至不支持它们。
  • 我们使用的是 Ubuntu 12.04.4 LTS。我认为它支持 websocket。
  • Websockets 应该可以在任何操作系统中运行,它只是一个套接字服务,没什么特别的。在 Windows 中,您可以使用第三方 websocket 服务。
  • 您使用的是弹性负载均衡器吗?您的应用程序是否使用 Elastic Beanstalk 部署?
  • 我不确定。可能是 AWS 在我的服务器前面有弹性负载均衡器。

标签: amazon-web-services websocket handshake jsr356


【解决方案1】:

到目前为止,平衡器不转发 websocket 标头。要使 WS 工作,您必须有一个公共 IP 地址,并且在您的应用程序前面没有其他服务。

【讨论】:

    【解决方案2】:

    我建议您尝试部署到云提供商:Heroku - 他们使用 node.js 和 websockets 的示例应用程序代码将使您快速启动并运行。使用特定端口的本地运行 websocket 应用程序 - 比如说 8888 将在 heroku 上运行良好:

    var port = process.env.PORT || 8888;
    

    因为 heroku 在内部将部署您的应用程序,并使用通过 PORT 可见的运行时生成的端口。 如果您将 node.js 与 websockets 一起使用,我建议使用 einaros ws 实现

    var WebSocketServer = require("ws").Server;
    

    无缝处理 ws 端口 -vs- http 端口的概念

    【讨论】:

      【解决方案3】:

      目前 ELB 不支持 HTTP 模式下的 Websocket。为了能够处理 Websocket,您需要将 ELB 配置为 tcp 模式(tcp 连接的有效负载将直接发送到服务器,因此 ELB 不会影响 http 和 ws 流)。使用此设置,您将无法看到呼叫者的 ip。

      如果没有 ELB Websocket 可以完美运行(AWS 只看到 ip 流量,而操作系统只看到 tcp 一个),我们没有为普通的旧 http 服务器更改任何东西以使用 WS(除了 web 中的 WS 处理代码服务器)。

      要知道您是否在使用 ELB,请查看账单,AWS 可以为您提供许多非常有趣的服务,但需要付费。

      【讨论】:

      • 非常感谢。我相信这是我的问题根源。
      猜你喜欢
      • 2013-05-27
      • 2021-11-14
      • 2019-05-27
      • 2013-09-05
      • 2015-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多