如何预热 CloudFront 边缘服务器的缓存?

How to pre-warm CloudFront edge servers' cache?

我们有一个要求,我们希望为特定的 CloudFront 分配预热所有边缘服务器的缓存。为此,我们需要将一些调用定向到所有边缘服务器。有什么方法可以识别区域内或全球的所有边缘服务器吗?

例如:

浏览此处提供的信息时:http://aws.amazon.com/cloudfront/details/

我发现亚洲有多个边缘服务器,以孟买(印度)和香港为例,我有兴趣将一些 HTTP 调用定向到这些边缘服务器。我怎样才能做到这一点?如果我能得到所有这些服务器的身份,那就太好了。

另外,我们最初想到的做法是: 在所有区域都有一个微型实例,并从中访问我们的资产。

但是这种方法有一个问题。从 CloudFront 文档中,我了解到边缘服务器之间没有层次结构,如果任何边缘服务器没有所需的资产,它会直接向 Origin 服务器询问该资产。现在,一个区域可以有多个边缘服务器。如果在一个区域内,所有边缘服务器都没有所需的资产,那么它就违背了进行此练习的目的。 那么,我的问题是如何确保一个区域中的所有边缘服务器都在其缓存中拥有所需的资产?

请注意,内容本质上是静态的。如果覆盖所有边缘服务器是不可能的,那么即使有一种方法可以覆盖,比方说,70% 的边缘服务器,我也想尝试一下。

https://github.com/chrismay/warmfront 看起来是一个合适的解决方案。解析全球多个 DNS 服务器上的 CloudFront 分布并将请求发送到已解析的 IP 地址。

Here is a post几年前亚马逊员工关于预热的内容:

The issue is, if everyone pre-cached objects to a edge location all of the edge locations would run out of space because they would be flooded with objects that may or may not be being accessed. Right now the edge location only caches objects that are being accessed by users and will dump objects that have no been accessed recently if there is no more room on the server. I am not sure how a pre-cached scenario would work if it were a service.

除非您知道您将在很长一段时间内获得稳定的流量,否则预热可能根本无效。 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 -

随意修改headers。我注意到除非你指定 gzip,否则它不会缓存 gzip。另外,如果您想限制页面 -> 在站点地图中进行。

通过 brew mac 或使用 yum linux 获取 wget。

我们通过 CloudFront 分发应用程序下载,我需要 pre-warm 在网站上下载两次。为此,我们使用 Pingdom。他们 ping 我从全球随机位置提供的 url,因此 pre-warm 我们的云端缓存。

pre-warm CF 缓存的唯一方法是请求特定的文件列表,例如转码视频的块或片段列表。这些请求可能来自连接到 CF 不同边缘缓存的不同 ISP。

即使我们创建一个 EC2 实例并将 RDP 或 SSH 放入该实例并 wget 或 curl 或以其他方式请求视频块,这也只会填充 1-2 个边缘缓存,这些缓存可能与您的缓存相关,也可能不相关正在使用和抱怨。

请求无法指定边缘缓存。请求可以指定AWS CF的区域,但不能指定具体的边缘缓存。