我们要求我们为特定的CloudFront分配预热所有边缘服务器的缓存。为此,我们需要将几个调用指向所有边缘服务器。有没有办法识别区域内或全局的所有边缘服务器?
例如:
在查看此处提供的信息时:http://aws.amazon.com/cloudfront/details/
我发现亚洲有多个边缘服务器,让我们以孟买(印度)和香港为例,我有兴趣为这些边缘服务器引导一些HTTP呼叫。我怎样才能做到这一点?如果我能获得所有这些服务器的身份,那就太棒了。
另外,我们最初想到了以下方法: 在所有地区都有一个微型实例,并从中访问我们的资产。
但这种方法存在问题。从CloudFront文档中,我了解到边缘服务器之间没有层级结构,如果任何边缘服务器没有所需资产,它会直接向Origin服务器询问该资产。现在,单个区域可以有多个边缘服务器。如果在一个区域内,所有边缘服务器都没有所需的资产,那么它就无法完成此练习。 那么,我的问题是如何确保区域中的所有边缘服务器都在其缓存中具有所需的资产?
请注意,内容本质上是静态的。如果覆盖所有边缘服务器是不可能的,那么即使有一种方法可以覆盖70%的边缘服务器,我想尝试一下。
答案 0 :(得分:2)
问题是,如果每个人都将对象预先缓存到边缘位置,则所有边缘位置都将耗尽空间,因为它们会被可能访问或未访问的对象所淹没。现在,边缘位置仅缓存用户正在访问的对象,如果服务器上没有更多空间,则将转储最近未访问过的对象。如果它是一项服务,我不确定预先缓存的场景是如何工作的。
除非您知道您将在较长时间内获得稳定的流量,否则预热可能不会有效。 CloudFront可能会很好地使您的对象过期,以便在其他客户对象获得比您自己更多(或更新近)的流量时腾出空间。一旦发生这种情况,您就完全失去了任何预热的优势,而且您已经能够执行。
答案 1 :(得分:1)
https://github.com/chrismay/warmfront看起来是一个合适的解决方案。解决遍布全球多个DNS服务器的CloudFront分发,并将请求发送到已解析的IP地址。
答案 2 :(得分:0)
我认为你不能在全世界范围内做到这一点。除非您可以从cloudfront找出全球网站的IP地址。 但是,如果您的站点中有sitemap.xml,则可以使用wget来缓存站点中的每个页面。它将下载站点地图,然后从站点地图请求每个页面。你可以在cron中设置它:
yoursite=https://yoursite.com
wget --quiet $yoursite/sitemap.xml --output-document - | egrep -o "$yoursite[^<]+" | wget -O/dev/null --header="User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" --header='Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' --header='Accept-Encoding:gzip, deflate, sdch, br' --header='Accept-Language:en-US,en;q=0.8,fr;q=0.6' --header='Cache-Control:no-cache' --header='Pragma:no-cache' --header='Upgrade-Insecure-Requests:1' $yoursite/ -i -
随意修改标题。我注意到除非你指定gzip,否则它不会缓存gzip。此外,如果你想限制页面 - &gt;在站点地图中进行。
使用yum通过brew或linux获取mac的wget。
答案 3 :(得分:0)
预热CF缓存的唯一方法是请求特定的文件列表,例如转码视频的块或片段列表。这些请求可能来自连接到CF的不同边缘缓存的不同ISP。
即使我们将EC2实例和RDP或SSH创建到该实例中并wget或curl或以其他方式请求视频块,也只会填充1-2个与您正在使用的边缘缓存有关或无关的边缘缓存并抱怨。
请求无法指定边缘缓存。该请求可以指定AWS CF的区域,但不能指定特定的边缘缓存。