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通过云端工作?或者这只是不支持?
更新
CloudFront宣布在2018-11-20 支持Websockets.
CloudFront全局支持WebSocket连接,无需任何其他配置.只要客户端和服务器都支持该协议,所有CloudFront发行版都具有内置的WebSocket协议支持.
客户端负责重新建立丢失的任何websocket连接.
CloudFront目前不支持Web套接字.
即使您尝试将CloudFront配置为转发它们,某些标头也会从请求中删除.这些在上表所示,你提到的页面通过"CloudFront的去除头"和Caching Based on Header Values Is Supported= "否".
来自AWS论坛:
请放心,合适的人知道此功能请求.
- Richard @ AWS(2015-06-06)
CloudFront不是Web套接字的正确解决方案,因为它针对静态网页的缓存进行了优化,而Web套接字大多是动态的.另一方面,ELB支持HTTP Web套接字(ws://)和Secure Web套接字(wss://),并且可以将其配置为处理所有SSL握手.但是,您需要使用TCP设置对其进行配置,以便在服务器传输时保持HTTP/HTTPS连接处于打开状态.以下是它的完成方式:
4.如果您正在进行安全的Web套接字,则需要选择一个证书,如下所示:
5.配置运行状况检查,添加实例并按"创建".定义CNAME,你就完全了.
请注意,如果选择"HTTP"或"HTTPS"作为源协议,负载均衡器将在某个时刻抛出408错误代码(超时),因为它不是为了保持连接打开时间太长而设计的.这就是我们选择TCP的原因.
| 归档时间: |
|
| 查看次数: |
8265 次 |
| 最近记录: |