CDN工程师必看-认知Cloudfront配置参数

近几年互联网应用风声水起,例如:电商,视频,游戏等,越来越成为生活习惯。如何在这场白日化的竞争中,争取到一席之地,除了专业,还有就是访问体验,而访问体验可通过CDN来提升。作为全球第二大CDN厂商的AWS,在海外还是拥有很强的基础设施覆盖(截止到2020年2月28日有205 个边缘站点和 11 个区域性边缘缓存,这些节点遍布 42 个国家/地区的 84 个城市)。
为让刚接触CDN的工程师对CDN有个了解,我们简单介绍一下CDN重要的节点:客户端(浏览器/App等)/CDN边缘站点/源站(服务器或S3),引用AWS官方博客的例子。
当客户端发起对 www.customer.com 的访问时,首先需要 DNS系统解析出该域名对应的主机IP,通过本地 ISP DNS递归查询到customer.com 的 DNS 域名服务器并了解到该域名是指向了xxx.cloudfront.net,进一步解析 xxx.cloudfront.net,CloudFront的DNS 域名服务器会根据请求来源的 IP 等信息,返回适合当前该客户端访问的边缘节点的主机 IP 如1.1.1.1,最终该客户端向1.1.1.1发出请求。如果该边缘节点已经缓存了该客户端请求的内容(图片、视频等静态文件),则直接返回给客户端,如果未缓存,则首先回源站取回该内容,并存储在边缘节点,以便下次客户端对该内容请求时可以直接返回该内容。
配置描述▼
要得到更好访问体验,需要源站与Cloudfront边缘站点进行相关参数配置:
简单一下介绍Cloudfront配置里面的相关术语,以便在进行相关配置指导时,能让工程师们更好在Cloudfront配置中找对应点:
源站(Origin): 是需要被加速的站点,可以是 S3 存储桶,可以是 ELB/EC2,可以是 Elemental MediaStore/MediaPackage,或者是用户自定义的站点(如第三方 IDC 中的 HTTP Web 服务器)。举个例子,在Nginx配置不被缓存:(相关参数:https://shuwoom.com/?p=4311
分配(Distribution):分配是 CloudFront 的基本单元,每个分配有独一的ID以及CloudFront 为其分配的域名(类似 abcdefg13456789.cloudfront.net)。目前有 Web和RTMP两种方式的分配,Web分配主要用于分发静态、动态内容,基于HTTP/s 协议的媒体文件分发,基于HLS(拉流)协议的互联网直播等。RTMP(推流)分配主要用于基于RTMP协议的视频点播场景,源站必须为S3存储桶,一个分配可以配置多个源站。
行为(Behaviors):CloudFront 通过路径匹配的方式决定执行哪一个缓存行为,一个分配中可以有多个Behaviors,并且每个Behaviors 对应一个源站。在Behaviors 中可以设置缓存 TTL 时间,允许的 HTTP 行为(GET,PUT,POST 等),与 Lambda 关联等。
基于S3静态托管Web服务

  1. 创建一个分配(包含一个源站)
  2. 配置缓存行为
  3. S3桶的创建在此不介绍
  4. 打开Console,创建一个分配,有两种选择,此次选择Web Distributio
    源设置参数部分解释如下:
    参数名称

参数解释

源路径(可选)

如果您希望 CloudFront 从 AWS 资源或自定义源的目录中请求内容,请输入目录路径并以斜杠 (/) 开头且不要以(/)结尾。假设已为分配指定以下值:

源域名 – 名为 myawsbucket 的 Amazon S3 存储桶 源路径 – /production备用域名 (CNAME) – example.com

当用户在浏览器中输入 example.com/index.html 时CloudFront 向 Amazon S3 发送请求以获取 myawsbucket/production/index.html。

源ID

为源输入描述。此值允许您区分同一分配中的多个源。每个源的描述在分配中必须是唯一的。

限制存储桶访问

如果您希望用户仅使用 CloudFront URL 而非 Amazon S3 URL 访问 Amazon S3 存储桶中的对象,请选择是。然后,指定其他值。

源访问身份

仅适用于Amazon S3存储桶来源(配置为网站终端节点的情况除外)

授予对存储桶的读取权限

CloudFront读取Amazon S3 存储桶中对象的权限

源自定义标头(可选)

您在此处指定的所有自定义标头键和值将包含在Cloudfront转发到此源的每个请求中。如果客户端请求中提供了标头,则会覆盖它

注意提醒:
1) 在配置 CloudFront 分配时,如果使用是Amazon S3 静态网站托管,请在源域名输入终端节点。该值显示在 Amazon S3 控制台的属性页面上的静态网站托管下面。例如:https://bucket-name.s3-website.region.amazonaws.com
2) 如为静态网站托管,可以不采用“限制存储桶访问”
3) 如果设置授予对存储桶的读取权限为“否,我将更新权限”,一定要手动去更权限,不然访问出错了
参考网址:https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html

  1. 缓存行为设置
    部分配置参数解释:
    参数名称

参数解释

路径模式

默认

查看器协议策略

Client到达CloudFront 时用的协议,支持HTTP 和HTTPS,并且提供重定向 HTTP 到 HTTPS

允许的 HTTP 方法

允许的 HTTP 动作,不同的 Behavior 可以配置不同的选项

字段级加密配置

在将 POST 请求转发到您的源站之前,CloudFront 的字段级加密使用特定于字段的加密密钥 (由用户提供) 对 HTTPS 表单中的敏感数据进行进一步加密

基于选择的请求标头进行缓存

重点关于Client端对Cloudfront访问时带header请求处理

无(改进缓存):Cloudfront不会根据请求header进行缓存。通常Client端请求到Cloudfront的header都会被移除,再转发给源站。

白名单:如果需要Cloudfront根据header内容区分缓存或源站需要按header内容分别处理,这时需要设置白名单。这样Cloudfront才会转发Client端的header内容到源站。

全部(不建议S3为源站的设置):这个设置会导致Cloudfront不做任何缓存(动态设置),会把Client端请求来的header全部转发给源站。并TTL也自动全部设置为“0”。

对象缓存

对象缓存

使用源缓存标头:根据您在源站设置的Cache-Control来决定在Cloudfront缓存时长,例如:Cache-Control: public; max-age=3600表示缓存1个小时。

自定义:在Cloudfront缓存时长,由Cloudfront设置TTL与源站设定Cache-Control决定,

通常情况如下:

当您自定义对象缓存时,可以配置默认TTL、最小TTL 和最大TTL。CloudFront 根据源站是否返回缓存标头来使用这些参数:如果源站不返回缓存标头,则分配使用默认TTL。如果源站返回的缓存标头小于最小TTL,则分配使用最小TTL。如果源站返回的缓存标头大于最大TTL,则分配使用最大TTL。

转发 Cookies

是否将Cookie转发回源站,同样 CloudFront 会基于此值缓存不同的内容。(可以白名单定义需要转发Cookies,不合适配置在S3作为源站)

查询字符串转发和缓存

是否将查询字符串转发回源站,同样 CloudFront 会基于此值缓存不同的内容。

限制查看器访问
(使用签名的 URL 或
签名的 Cookies)

浏览器否使用签名的URL或签名的 Cookie

自动压缩对象

是否启用自动压缩。如果在查看器请求标头包含 Accept-Encoding :gzip,则 可以开启CloudFront 自动压缩,以减小流量传输。

Lambda 函数关联

指定要为其添加触发器的 Lambda 函数的 Amazon 资源名称 (ARN)。

注意提醒:
1) 需要关注“基于选择的请求标头进行缓存和对象缓存”配置,这会影响缓存内容和缓存时长,如何提高缓存命中率,当然也跟Cookies和Query String有关,可以参考:https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/ConfiguringCaching.html
2) 自定义缓存对象时,需要关注的点,可以参考:https://aws.amazon.com/cn/premiumsupport/knowledge-center/cloudfront-custom-object-caching/
3) S3存储桶作为源端,标头添加的设置:https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/Expiration.html#ExpirationAddingHeadersInS3

  1. 分配设置
    分配设置部分参数解释:
    参数名称

参数解释

价格级别

分为三个区域,价格各不相同。分美国,加拿大和欧洲;国,加拿大,欧洲,亚洲,中东和非洲;所有边缘站点(最佳性能)

AWS WAF Web ACL

可以已经创建的WAF进行关联,也可以在未来创建关联

备用域名
(CNAMEs)

(正常是必选项),就是填写您们公司与cloudfront.net CNAME的域名,例如:www.bosicloud.com

SSL 证书

此次如果使用的是自己域名,请选择此选项。您可以使用存储在美国东部(弗吉尼亚北部)区域的 AWS Certificate Manager (ACM)
中的证书,也可以使用存储在 IAM 中的证书。

支持边缘站点专用IP 和 SNI 两种模式

日志记录

建议开启日志,方便未来做日志分析与故障排查

日志存储桶/前缀

日志存储位置和Cloudfront为该分配的访问日志文件名前面添加字符串

注意提醒:
1) CloudFront规定当使用自定义域名并配置该域名使用CNAME或Alias的方式指向CloudFront distribution的域名的时候,需要在CloudFront相应的“分配设置的备用域名”中提供该自定义的域名。否则访问会出错或域名没办法加速。
2) 配置和使用访问日志:https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html
场景优化配置▼
本节将介绍一些常用场景TTL配置,动态加速,设置样例以及错误处理。

  1. TTL设置
    CloudFront 在计算 Cache key 时会将请求的 URL 以及当前分配对应的Behavior 的配置(如是否转发 Header、Cookie、查询字符串)考虑在内,计算出唯一值。因此即使两次请求都是相同的URL,如果两次请求的个别Header 不一样,且该Header配置为了转发(Cached based on Selected Headers),则计算出的Cache key也不同,返回给客户端的内容自然也不同。因此配置转发的查询字符串、Cookie 及 Header 越少,Cache key 也将越少,缓存命中率就越高,带来了性能也越好。如果同一个源端有不同动态或静态需要加速,最好配置多个行为(Behaviors),来达缓存效果。
    对于用户内容在PoP点的缓存TTL,可以由源站的 Cache Control: max-age参数值,或者在 Behavior的Customized的Minimum TTL、Maximum TTL、Default TTL的参数值决定。(https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/Expiration.html
    分类

长期静态内容

短期静态内容

动态内容

举例

.css, .js, .jpg, .png

软件下载,媒体文件,媒体分片文件(HLS .ts,.m3u8)。

登录页,index.jsp,新闻,天气信息,HLS 直播 m3u8 文件。

变化的内容,不可缓存的内容。

建议

不变的内容可以设置较大的 TTL 值,例如:使用版本号更新内容。

定期更新的内容设置低 TTL 值。TTL 到期后,CloudFront 回源校验源站内容是否发生变化。

经常变化的内容;按请求不同内容不同;设置很低甚至0 TTL。

动态内容场景:有以下两方式:

  1. 使用源缓存标头(基于源端的设置)
    1) Cache-Control: no-cache; max-age=0; No-store; private
    2) Cache-Control: public; max-age=0
  2. 基于选择的请求标头进行缓存(基于Cloudfront)
    1) 直接在‘Cache based on Selected Header’处选‘All’此时自定义:Minimum TTL,Maximum TTL,Default TTL自动设置为0
    源端设置例子:
    静态资源

登录页

媒体分片

动态内容

HLS 直播

.css, .js, 软件下载,更新包等

Index.html

/*.ts

/*.m3u8

Cache-Control:
public;
max-age=31536000

Cache-Control:
no-cache=Set-Cookie;
max-age=30

Cache-Control:
public;
max-age=31536000

Cache-Control:
no-cache;
max-age=0;No-store;private

Cache-Control:
public;
max-age=2

  1. 错误处理
    当源站不可用时,可以在 CloudFront 配置针对400,403,404,405,414,500,501,502,503,504等错误码的自定义响应页并修改返回给客户端的响应码。CloudFront 将周期性验证源站的可用性,并可在源站恢复前将当前缓存中的内容作为响应返回给客户端。

设置方式可见https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/GeneratingCustomErrorResponses.html
参考资料:

[1]开发人员指南:https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/Introduction.html

[2] Amazon CloudFront 常见错误配置及解决方法: https://amazonaws-china.com/cn/blogs/china/cloudfront-errors-solutions/

[3] 如何减少收到“X-Cache:Miss from cloudfront”响应的请求的延迟https://aws.amazon.com/cn/premiumsupport/knowledge-center/cloudfront-latency-xcache/

[4] 我在 CloudFront 分配上设置了自定义对象缓存。为什么我的分配使用我的源的缓存设置?https://aws.amazon.com/cn/premiumsupport/knowledge-center/cloudfront-custom-object-caching/

[5] 如何阻止 CloudFront 缓存某些文件?https://aws.amazon.com/cn/premiumsupport/knowledge-center/prevent-cloudfront-from-caching-files/

猜你喜欢

转载自blog.51cto.com/14819544/2498161