我最近设置了一个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 ✔
JavaScript 的 TCP 套接字请求在此同一端口上设置套接字(使用分配给 AWS 公共 IP 的 URL),这是请求返回错误的位置:
将套接字绑定到 0.0.0.0 将导致相同的错误。WebSocket 连接到 'wss://[URL]:4433/projects/socket' 失败:WebSocket 开启握手被取消。
为了启动 Haskell Web 服务器,我不得不引用 AWS 提供的 内部 IP,因为当引用弹性 IP 服务提供的 公共 IP 时无法运行。考虑到这可能是问题所在,我将套接字请求更改为以下内容...
wss://[internal ip]:4433/projects/socket
这里的错误是:
WebSocket连接到'wss://[内部IP]:4433/projects/socket'失败:建立连接时出错:net::ERR_CONNECTION_REFUSED
我认为这个错误很有道理,因为内部IP对外部世界不可用。
我在AWS上阅读的所有与WebSockets相关的内容都涉及ELB(弹性负载均衡器),而我并不需要其中的一个。我已经尝试了目前SO上所有已发布答案中的所有方法(有些问题甚至没有得到答案),但是都没有成功。我还向Amazon建立了一个支持案例(将近24小时前),但还没有收到回复。
其他信息
导航到http://[URL]:4433/projects/socket
会显示“WebSocket可用”,其中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 时遇到类似的问题吗?如果有,你是如何解决这个问题的?