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服务css

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

参数解释html

源路径(可选)web

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

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

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

源IDjsp

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

限制存储桶访问函数

若是您但愿用户仅使用 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/

相关文章
相关标签/搜索