近几年互联网应用风声水起,例如:电商,视频,游戏等,愈来愈成为生活习惯。如何在这场白日化的竞争中,争取到一席之地,除了专业,还有就是访问体验,而访问体验可经过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
参数解释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
参数解释
路径模式
默认
查看器协议策略
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
参数解释
价格级别
分为三个区域,价格各不相同。分美国,加拿大和欧洲;国,加拿大,欧洲,亚洲,中东和非洲;全部边缘站点(最佳性能)
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配置,动态加速,设置样例以及错误处理。
长期静态内容
短时间静态内容
动态内容
举例
.css, .js, .jpg, .png
软件下载,媒体文件,媒体分片文件(HLS .ts,.m3u8)。
登陆页,index.jsp,新闻,天气信息,HLS 直播 m3u8 文件。
变化的内容,不可缓存的内容。
建议
不变的内容能够设置较大的 TTL 值,例如:使用版本号更新内容。
按期更新的内容设置低 TTL 值。TTL 到期后,CloudFront 回源校验源站内容是否发生变化。
常常变化的内容;按请求不一样内容不一样;设置很低甚至0 TTL。
动态内容场景:有如下两方式:
登陆页
媒体分片
动态内容
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
设置方式可见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/