如何在AWS CloudFront上启用WebSockets

9
我在AWS EC2 Autoscale集群上运行了一个Akka HTTP服务器。该集群有一个ELB应用程序负载均衡器。除了ELB外,我们还设置了一个云前置分发,用于提供静态文件。
我们遇到了一个问题,即浏览器到后端的所有websocket连接请求都失败,并显示“HTTP 400 Expected UpgradeToWebsocket header”错误。
进一步调查后,我们发现客户端能够直接连接到负载均衡器,但通过Cloudfront的任何连接请求都会失败。最终,我在AWS Cloudfront文档中找到了this page,它说Cloudfront会剥离可能导致客户端无法连接的“升级”头信息。
为解决此问题,我启用了所有“header forwarding”选项(禁用缓存),但仍无法解决。此外,我找不到任何选择性地禁用Cloudfront缓存或完全绕过某些URL的Cloudfront的选项。
如何解决此问题并确保WebSocket可以通过Cloudfront正常工作?或者这是不支持的吗?
2个回答

8

更新

CloudFront于2018年11月20日宣布支持WebSocket

CloudFront全球支持WebSocket连接,无需额外配置。只要客户端和服务器都支持该协议,所有CloudFront分发都内置了WebSocket协议支持。

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-working-with.websockets.html

如果websocket连接丢失,客户端需要重新建立连接。

CloudFront目前不支持WebSocket。

即使您尝试配置CloudFront转发这些头信息,某些头信息仍将被去除。这些在您提到的页面上的表格中指出,标记为"CloudFront移除了头信息"Caching Based on Header Values Is Supported="No"

来自AWS论坛:

请放心,有关此功能请求的相关人员已经知晓。

— Richard@AWS (2015-06-06)

https://forums.aws.amazon.com/thread.jspa?messageID=723375


更新了,但是并没有提供在支持后如何实现的答案。 - xenoterracide
1
@xenoterracide,其实没什么可说、可做、可配置的。Websockets 已在所有 CloudFront 发布中自动启用。 - Michael - sqlbot

8
CloudFront并不适合用于WebSockets,因为它优化了静态网页缓存,而WebSockets主要是动态的。另一方面,ELB支持HTTP WebSockets(ws://)和安全WebSockets(wss://),并且可以配置它来处理所有SSL握手。但是,您需要使用TCP设置进行配置,以使服务器在传输时保持HTTP / HTTPS连接打开状态。以下是操作步骤:
1. 在EC2负载均衡器选项卡中单击“创建负载均衡器” 2. 选择“经典负载均衡器”。您需要这样做才能进行简单的TCP 3. 定义源和目标协议(选择普通WebSockets的TCP): enter image description here 4. 如果您正在执行安全WebSockets,则需要选择证书,如下所示:

在此输入图片描述 5. 配置健康检查,添加实例并点击“创建”。定义CNAME即可完成设置。

请注意,如果您将源协议选择为“HTTP”或“HTTPS”,负载均衡器在某个时刻会抛出408错误代码(超时),因为它不设计保持连接太长时间。这就是我们选择TCP的原因。


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