为什么采用 HTTP 协议的 AWS 经典 ELB 不能与 websockets 一起使用?

为什么采用 HTTP 协议的 AWS 经典 ELB 不能与 websockets 一起使用?

我知道有一种适用于 websocket 的 ALB 和 NLB 选项。我不明白为什么使用 HTTP 协议的经典 ELB 不适用于 websocket 连接,尽管在这种情况下,Nginx 已配置为添加连接和升级标头。一旦我将其切换到 TCP 协议,它就可以工作了。您能解释一下当中间有 HTTP 代理时,该协议究竟是如何工作的吗?

它仍然使用相同的 TCP,一旦客户端到达服务器并且 Nginx 添加了升级标头,带有切换协议消息的服务器响应应该到达客户端,然后它们就使用已建立 HTTP 连接的 TCP。它在 ELB 上丢弃此连接的原因是什么,响应缓冲,还是它只是丢弃所有非 HTTP 流量?

因此 Nginx 发送到 ELB

 HTTP/1.1 101 Switching Protocols
Server: nginx/1.13.1
Date: Sat, 21 Mar 2020 07:53:38 GMT
Connection: upgrade
Upgrade: websocket
Sec-WebSocket-Accept: PozdkhgL/Zdkgh3kwu0KkACFCt0=

但 ELB 从未将其送回客户端,并且请求超时。

答案1

Classic ELB 不支持 Websockets。AWS 没有公布不支持的原因。正如您所指出的,从下面参考资料中的图表中,它明确指出 ALB 和 NLB 支持 Websockets。但 Classic 不支持它们的原因尚未披露。

底线是,如果你想使用带有 Websockets 的 ELB,请使用 ALB 或 NLB

参考

Elastic Load Balancer 功能

答案2

我不知道为什么 ELB 不支持 websockets。但如果卖方说他们不支持它,你应该坚持这一点。

嘿,这是他们的平台。

相关内容