如何在AWS Cloudfront上启用websockets

时间:2016-12-26 11:32:51

标签: amazon-web-services websocket amazon-cloudfront amazon-elb akka-http

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

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

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

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

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

2 个答案:

答案 0 :(得分:6)

<强>更新

CloudFront announced support for Websockets于2018-11-20。

  

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

     

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

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

CloudFront目前不支持网络套接字。

即使您尝试配置CloudFront转发它们,某些标头也会从请求中删除。这些内容在page you mentioned上的表格中由“CloudFront删除标题”Caching Based on Header Values Is Supported = “否” < / p>

来自AWS论坛:

  

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

     

- Richard @ AWS(2015-06-06)

     

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

答案 1 :(得分: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. enter image description here  4.如果您正在进行安全的Web套接字,则需要选择一个证书,如下所示:

    enter image description here  5.配置运行状况检查,添加实例并按“创建”。定义CNAME,你就完全了。

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