如何在AWS Cloudfront上启用websockets

Moj*_*ojo 5 amazon-web-services websocket amazon-cloudfront amazon-elb akka-http

我有一个在AWS EC2 Autoscale集群上运行的Akka HTTP服务器.此EC2自动扩展群集前面有一个ELB应用程序负载平衡器.除了ELB之外,我们还有一个云端分布,设置为提供静态文件.

我们面临的问题是,从浏览器到后端的所有websocket连接请求都会因HTTP 400 Expected UpgradeToWebsocket header错误而失败.

经过进一步调查,我们发现客户端能够直接连接到负载均衡器,但是通过云端的任何连接请求都会失败.最后,我在AWS Cloudfront文档中看到了这个页面,其中说cloudfront删除了任何"升级"标头,这可能是客户端无法连接的原因.

若要解决此问题,我启用了所有"标头转发"选项(禁用缓存),但它仍然无法正常工作.此外,我找不到任何选择性禁用云端缓存或完全绕过某些URL的云端的选项.

如何解决此问题并确保websockets通过云端工作?或者这只是不支持?

Mic*_*bot 8

更新

CloudFront宣布在2018-11-20 支持Websockets.

CloudFront全局支持WebSocket连接,无需任何其他配置.只要客户端和服务器都支持该协议,所有CloudFront发行版都具有内置的WebSocket协议支持.

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

客户端负责重新建立丢失的任何websocket连接.

CloudFront目前不支持Web套接字.

即使您尝试将CloudFront配置为转发它们,某些标头也会从请求中删除.这些在上表所示,你提到的页面通过"CloudFront的去除头"Caching Based on Header Values Is Supported= "否".

来自AWS论坛:

请放心,合适的人知道此功能请求.

- Richard @ AWS(2015-06-06)

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


oha*_*aty 5

CloudFront不是Web套接字的正确解决方案,因为它针对静态网页的缓存进行了优化,而Web套接字大多是动态的.另一方面,ELB支持HTTP Web套接字(ws://)和Secure Web套接字(wss://),并且可以将其配置为处理所有SSL握手.但是,您需要使用TCP设置对其进行配置,以便在服务器传输时保持HTTP/HTTPS连接处于打开状态.以下是它的完成方式:

  1. 单击EC2负载平衡器选项卡中的"创建负载平衡器"
  2. 选择"Classic Load Balancer".你需要它来做一个简单的TCP
  3. 定义源和目标协议(为纯Web套接字选择TCP):

在此输入图像描述 4.如果您正在进行安全的Web套接字,则需要选择一个证书,如下所示:

在此输入图像描述 5.配置运行状况检查,添加实例并按"创建".定义CNAME,你就完全了.

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