我在AWS EC2 Autoscale集群上运行了Akka HTTP服务器。此EC2自动扩展群集前面有一个ELB应用程序负载平衡器。除了ELB之外,我们还有一个云端分布,设置为提供静态文件。
我们遇到的问题是,从浏览器到后端的所有websocket连接请求都会因HTTP 400 Expected UpgradeToWebsocket header
错误而失败。
经过进一步调查,我们发现客户端能够直接连接到负载均衡器,但是通过cloudfront的任何连接请求都会失败。最后,我在AWS Cloudfront文档中遇到了this page,其中说cloudfront删除了任何“升级”标头,这可能是客户无法连接的原因。
要解决此问题,我启用了所有“标头转发”选项(禁用缓存),但它仍然无法正常工作。此外,我找不到任何选择性禁用云端缓存或完全绕过某些URL的云端的选项。
如何解决此问题并确保websockets在云端工作?或者这只是不受支持?
答案 0 :(得分:6)
<强>更新强>
CloudFront announced support for Websockets于2018-11-20。
CloudFront全局支持WebSocket连接,无需任何其他配置。所有CloudFront发行版都具有内置的WebSocket协议支持,只要客户端和服务器都支持该协议。
客户端负责重新建立丢失的任何websocket连接。
CloudFront目前不支持网络套接字。
即使您尝试配置CloudFront转发它们,某些标头也会从请求中删除。这些内容在page you mentioned上的表格中由“CloudFront删除标题”和 < / p>
Caching Based on Header Values Is Supported
= “否”。
来自AWS论坛:
请放心,合适的人知道此功能请求。
- Richard @ AWS(2015-06-06)
答案 1 :(得分:5)
CloudFront不是适用于Web套接字的正确解决方案,因为它针对静态网页的缓存进行了优化,而Web套接字主要是动态的。另一方面,ELB支持HTTP Web套接字(ws://)和Secure Web套接字(wss://),并且可以将其配置为处理所有SSL握手。但是,您需要使用TCP设置对其进行配置,以便在服务器传输时保持HTTP / HTTPS连接处于打开状态。以下是它的完成方式: