我正在努力了解Cloudfront是如何工作的。假设静态网站是static.com,动态网站是dynamic.com。static.com有数千个html文件,其中包含引用来自static.com的图像的img标签。
dynamic.com是基于Java的动态生成HTML和img标签,图像来自dynamic.com
假设图像没有手动复制到s3。除DNS设置外,两个站点均未对Cloudfront进行任何修改。
假设static.com的Cloudfront url设置为mystaticxyzz.Cloudfront.net,dynamic.com为mydynamicxyzz.Cloudfront.net
CloudFront作为位于Origins
前面的CDN工作。
这些源是CloudFront将流量转发到的端点,用于检索响应和内容。这可以是单个服务器、负载均衡器或任何其他可公开访问的可解析主机名。
如果您想在静态和动态内容之间进行拆分,您可以为同一分发中的每种类型的内容创建一个来源。一个将是默认原点,而另一个将基于文件路径(/css
或/images
)进行匹配。
这些来源中的每一个都可以包括自己的缓存行为,使您能够定义是否应该缓存它们以及缓存多长时间。
当用户根据路径访问CloudFront域时,它将路由到适当的源,或在可能的情况下从边缘缓存检索响应。
我知道这已经很晚了,但我只想在这里为那些难以缓存动态和静态内容的人添加这一点。
首先,你需要了解你的应用程序。
客户端渲染
如果你有一个reactjs,你不需要太担心你的缓存行为,因为你将要渲染,数据将从api客户端获取。
传递给最终用户的静态文件/内容都不会改变。
由于API请求将来自不同的域,因此cdn不会缓存这些数据。此外,正在渲染的数据将通过javascript更新html。如果您的javascript文件不断更新,那么您可以对它们使用无效。
如果您的内容未存储在源上,并且您的CSR应用程序正在使用网站域中的单独域获取内容,则需要设置一个单独的cdn,并将域名指向该cdn。您不需要对您的应用程序进行任何更改,因为域名保持不变。
然而,如果静态内容存在于同一来源(例如s3),则您只需使用请求将从客户端到cdn到来源(如果未缓存/过期)的cdn的域名来请求内容
最后,假设我们有不同的来源,比如react应用程序的s3桶和图像的s3桶。我们可以建立一个具有多个来源的单个cdn。这意味着我们可以使用cloudfront作为聚合器,然后您将能够通过使用特殊路径缓存来自不同来源的内容。
这意味着,你以前在哪里打电话给那些起源。即,使用s3域名,您需要将它们更新为单个域名,因为缓存行为将处理对各个域的请求
示例:www.example.com(react app react s3 bucket)www.example.com/images(一些s3图像桶)
<img source={{url:"www.example.com/images/example.jpg"}} />
cloud front将基于该源向该服务器请求在"上配置的行为/图像";
服务器端渲染
对于服务器端渲染的应用程序,理想情况下,源上的默认cahcing行为应该允许所有不同的http方法,因为您将有post和put http请求,您希望cloudfront将这些请求转发到源。
请确保使用请求策略将所有查询字符串和cookie转发到源。您可以使用白名单查询字符串或cookie对其进行微调,但这将使生活更轻松。此外,默认缓存行为应使用禁用缓存的缓存策略,即最小、默认、最大ttls=0秒。这是因为内容本质上是动态的,在服务器端而不是客户端上呈现,因此根据应用程序的设置方式,您将在应用程序中遇到意外行为。
如果你在不同的路径上有静态内容/img"css",或"/"网页/信息";缓存那些独立于默认行为的ttl。
如果你不想配置101个行为,你可以使用缓存控制头来做一些很酷的事情。https://aws.amazon.com/blogs/networking-and-content-delivery/improve-your-website-performance-with-amazon-cloudfront/
只要了解你的应用程序,你就可以正确地利用cdn
如果您有一个混合了服务器端和客户端渲染的Web服务器
只需确定哪些路径是客户端呈现的,并缓存这些静态文件。
任何本质上是动态的、需要应用程序向源发出请求的东西,都可以在行为中使用禁用缓存的策略。
此外,如果某些内容在客户端(如图像)进行渲染,则前面提到的任何模式(使用具有单个/多个来源的单个cdn或具有不同来源的多个cdn)都适用于服务器端渲染