WebSockets: 通过ELB从客户端到Amazon AWS EC2实例的wss连接

20
如何通过ELB连接到在Amazon AWS EC2实例上通过ssl提供的GlassFish Websocket?
我在GlassFish 4.1 b13预发布版中使用Tyrus 1.8.1作为我的Websocket实现。
端口8080未受保护,端口8181受ssl保护。
ELB DNS名称:elb.xyz.com
EC2 DNS名称:ec2.xyz.com
Websocket路径:/web/socket
我已成功地使用ws和wss直接连接到我的EC2实例(绕过我的ELB)。即以下两个URL均可正常工作:
ws://ec2.xyz.com:8080/web/socket
wss://ec2.xyz.com:8181/web/socket
我已成功地通过使用tcp 80> tcp 8080侦听器,在我的ELB上使用非ssl的ws。即以下URL可以正常工作:
ws://elb.xyz.com:80/web/socket
然而,我一直无法找到使用wss的方法。我尝试了很多事情。
我认为使wss通过我的ELB工作的最有可能的方法是在我的ELB上创建一个启用代理协议的tcp 8181> tcp 8181侦听器,并使用以下URL:
wss://elb.xyz.com:8181/web/socket
不幸的是,这并没有起作用。我猜我可能需要在GlassFish上启用代理协议,但我无法找出如何做到这一点(或者是否可能,或者是否必须对于wss在我的ELB上工作)。
另一个选项可能是以某种方式使ws或wss在ELB上终止的ssl连接运行,并通过使用ssl> tcp 8080侦听器而不受保护地继续到glassfish。但这对我来说也没有起作用,但可能一些设置不正确。

有人对我之前提到的两个试验有什么修改意见吗?或者有人有其他建议吗?

谢谢。


早上好,我正在尝试在Amazon EC2服务器上使用PHP运行Web服务。因此,您提到您可以告诉我如何实现它以供参考。如果您能提供帮助和指导,那将是非常有帮助的。我的电子邮件是elvis1527@gmail.com - Elvis Rodriguez
2个回答

24

我曾有过一个类似的设置,最初将我的ELB侦听器配置如下:

  • HTTP 80 HTTP 80
  • HTTPS 443 HTTPS 443

虽然这对于网站本身运行良好,但websocket连接失败。在侦听器中,您需要允许所有安全TCP连接,而不仅仅是SSL,以便wss也可以通过:

  • HTTP 80 HTTP 80
  • SSL(安全TCP) 443 SSL(安全TCP) 443

我还建议将ELB的空闲超时时间增加。


我是指“与仅限HTTPS相反”。 - guillaumepiot
1
关于这个问题,有几点需要注意:如果您更改此设置,则无法启用粘性会话。根据亚马逊的文档,“经典负载均衡器”不支持WebSockets:https://aws.amazon.com/elasticloadbalancing/details/#compare - TechSavvySam
我爱你,你拯救了我们的业务! - Andrea Salicetti

8
我最近在浏览器和EC2 Node.js实例之间启用了wss。需要考虑两个方面:
  • 在ELB监听器选项卡中,添加一个wss端口的行,并将SSL设置为负载均衡器协议。
  • 在ELB描述选项卡中,设置更高的空闲超时时间(连接设置),默认为60秒。 ELB会在1分钟后终止websocket连接,将空闲超时时间设置为3600(最大值)可以实现更长时间的通信。
显然这不是最终解决方案,因为超时仍然存在,但1小时对我们通常所做的事情可能已经足够了。
希望这能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接