我最近设置了一个EC2实例(在没有负载均衡器的VPC中)并且无可否认配置有点奇怪,但它正是我们运行的Web应用程序所需要的。
Web服务器(在Haskell中)在端口4433上运行(标准端口是为Apache实例保留的),并且正在接收从另一个系统广播的UDP数据包。我有很多端口是开放式的(仅在测试期间),如此处所示(来自安全组):
Custom TCP Rule 4433 tcp 0.0.0.0/0 ✔
Custom TCP Rule 8080 tcp 0.0.0.0/0 ✔
SSH 22 tcp 0.0.0.0/0 ✔
HTTP 80 tcp 0.0.0.0/0 ✔
HTTPS 443 tcp 0.0.0.0/0 ✔
Custom UDP Rule 30090 udp 0.0.0.0/0 ✔
Custom UDP Rule 30089 udp 0.0.0.0/0 ✔
TCP套接字的JavaScript请求在同一端口上设置套接字(使用分配给AWS的公共IP的URL),这是请求返回错误的位置:
与'wss:// [URL]:4433 / projects / socket'的WebSocket连接失败:WebSocket打开握手被取消。
将套接字绑定到0.0.0.0会导致相同的错误。
为了启动Haskell Web服务器,我必须引用AWS提供的内部 IP,因为它在引用弹性IP提供的 public IP时不会运行服务。想到这就是问题出现的地方我把套接字请求改为了......
wss://[internal ip]:4433/projects/socket
这会更改错误:
与'wss:// [内部IP]:4433 / projects / socket'的WebSocket连接失败:连接建立错误:net :: ERR_CONNECTION_REFUSED
这个错误对我有意义,因为外部世界无法使用内部IP。
我在AWS上的websockets上阅读的所有内容都涉及ELB(弹性负载均衡器),我不需要其中任何一个。我已经尝试了所有当前发布的答案中的所有内容(有些问题甚至没有得到答案),但无济于事。我还在亚马逊(大约24小时前)设置了一个支持案例,但尚未收到回复。
导航到http://[URL]:4433/projects/socket
会产生'WebSocket Available',其中URL是我们希望使用的URL以及AWS提供的公共DNS。
正在运行netstat -plunt
会显示以下内容:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 [internal IP]:8080 0.0.0.0:* LISTEN -
tcp 0 0 [internal IP]:4433 0.0.0.0:* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
tcp6 0 0 :::443 :::* LISTEN -
tcp6 0 0 :::80 :::* LISTEN -
udp 0 0 [internal IP]:30089 0.0.0.0:* -
udp 0 0 0.0.0.0:30090 0.0.0.0:* -
udp 0 0 0.0.0.0:11950 0.0.0.0:* -
udp 0 0 0.0.0.0:68 0.0.0.0:* -
udp6 0 0 :::38450 :::* -
AWS上的websockets是否有类似的问题?如果是这样,你是如何解决这个问题的?
答案 0 :(得分:19)
Haskell服务器和Apache服务器之间存在SSL证书不匹配。
必须使用有关实例的新证书的信息重建Haskell服务器。更复杂的是,EC2实例上没有安装正确的SSL库(libssl0.9.8 libssl-dev
),这在重建Haskell服务器期间导致了我的问题。知道EC2实例是一个“空白画布”,使得缺少该安装是我的错。
一旦安装了libssl
,我就可以重建Haskell服务器,并指向新证书。一旦证书“匹配”,websocket问题就消失了。
重申一下,我们的情况是独一无二的。我们有一个Apache服务器(端口80和443)和一个Haskell服务器(端口8080和4433),它们相互通信,通过websockets执行pub-sub操作。两个服务器之间的证书不匹配(它不重要的是什么类型,它可能是多个Apache实例)导致SSL警告。来自SSL的任何警告都将删除任何建立或维护websocket的尝试(因此取消了握手消息)。
Another StackOverflow post提供了一些在此过程中提供巨大帮助的线索。更具体地说,这个警告 -
问题的关键在于:如果您的SSL证书导致任何类型的警告,wss:// WebSocket连接将立即失败,并且没有规范的方法来检测它。 / p>
答案 1 :(得分:0)
在使用来自file:// URL的基于blob的webworker的websockets时遇到此错误。我怀疑在网络服务器上运行可能会解决这个问题;我在调试时通过关闭SSL解决了这个问题。
答案 2 :(得分:0)
如果websocket
网址未正确放入frontend
检查此答案websockets in https connection
放置前端网址的正确方法是"wss://example.com/wss/"
放置前端网址的方法错误
wss://example.com:8080/wss/ -> port no should not be mentioned
ws://example.com/wss/ -> url should start with wss only.
wss://example.com/wss -> url should end with / -> most important