2

我有一台在AWS EC2 Autoscale集群上运行的Akka HTTP服务器。此EC2自动缩放群集在前面有一个ELB应用程序负载均衡器。除了ELB之外,我们还有一个云端分布,用于提供静态文件。如何在AWS Cloudfront上启用Websocket

我们正面临着一个问题,即所有从浏览器到后端的websocket连接请求都会失败,出现HTTP 400 Expected UpgradeToWebsocket header错误。

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

要解决此问题,我启用了所有“标题转发”选项(禁用缓存),但仍然无法使用。此外,我无法找到任何选项来选择性地禁用云端缓存或绕过某些URL的云端服务。

我该如何解决此问题并确保websockets能够通过cloudfront工作?或者这只是不被支持?

回答

0

CloudFront目前不支持Web套接字。

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

从AWS论坛:

放心,正确的人都知道这个功能要求。

—理查德@ AWS(2015年6月6日)

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

3

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

  1. 单击EC2负载均衡器选项卡
  2. 选择“经典负载平衡器”,“创建负载平衡器”。你需要的是,为了做一个简单的TCP
  3. 定义源和目的地协议(TCP选择对于普通的网络套接字):

enter image description here 4.如果你正在做着做着就需要安全的网络套接字选择一个证书,如下所示:

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

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