AWS cloudfront 遇到的问题


登录aws控制台调出cloudfront

Distribution:分配,是 CloudFront 的基本单元,每个分配有唯一的 ID 以及CloudFront 为其分配的域名(类似 abcdefg13456789.cloudfront.net)。

Origin: 源站,顾名思义,是需要被加速的站点,可以是 S3 存储桶,可以是 ELB/EC2,可以是 Elemental MediaStore/MediaPackage,或者是用户自定义的站点(如第三方 IDC 中的 HTTP Web 服务器)。一个分配中可以有多个源站。

Behaviors:行为, CloudFront 通过路径匹配和优先级决定执行哪一个缓存行为,一个分配中可以有多个 行为,并且每个 行为 对应一个源站。在 行为 中可以设置缓存 TTL 时间,允许的 HTTP 行为(GET,PUT,POST 等),与 Lambda@edge函数关联等等。

填写origin domain 源站信息,业务需要多个线路同源那么需要把源站域名地址填写,其他先默认建立一个cloudfront会得到一个aws分配的*.cloudfront.net域名,

参数解释如下:

源 设置
源域源站地址,仅支持域名方式。也可以通过下拉列表直接选择帐号里已经创建过的 ELB,S3,MediaStore,MediaPackage等。如果是自定义站点,需先给该站点配置一个域名,不能填写 IP。
协议CloudFront 回源协议,可以是 HTTP 或 HTTPS,或者与实际客户请求时一样的协议。注意这儿是 CloudFront 回源站时用的协议,而不是CloudFront对外服务的协议。如果选用了 HTTPS,一定要注意源站已经配置对应回源域名(Origin Domain Name)的 SSL 证书。
源路径(可选)如果源站内容有多层目录,而又希望回源的时候路径上不体现这些目录,可以在此设置要隐藏的目录层级。例如:配置源路径 /version1 后,客户访问www.customer.com/page.html 相当于访问源站 origin.customer.com/version1/page.html
名称可以设置一个容易记忆的名字
添加自定义标头可以在请求源站时,带上特殊的Http header头,例如可以带上自定义的验证头。
启用源护盾源护盾是一个附加的缓存层,可以减少源站回源的压力,如果源站不在亚马逊云科技上部署,通过源护盾,还可以改善回源的稳定性和速度。源护盾会产生额外的费用。
其他设置可以设置回源时的失败重试次数,连接超时,响应超时,以及连接复用的保持时间。

点击cloudfront调出cdn界面,看到备用域名是自己的cdn域名及ssl证书,如果需要用自有域名则点击编辑配置。

配置之前需要先定好自己的cdn域名,申请ssl证书,ssl证书需要导入AWS,找到

ACM-[Certificate Manager],需要在右上角选择好区域比如弗吉尼亚,每个区域对应各自的证书,选错了可能看不到证书,开始导入证书pem和key


导入证书以后,在备用域名开始配置自己的域名及ssl证书,遇到了问题,报错了

the certificate that is attached to your distribution was not issued by a trusted Certificate Authority…

CA证书不被信任,那就从aws请求一个证书:证书-请求证书-填好自己的域名然后下一步


然后ssl证书处于等待验证状态还不能用,同时得到一个cname名称和cname值,这2个值不走寻常路直接解析cname时候记录值是cname的值,cname名称应该是主机记录值进行解析dns验证;

参考:https://docs.aws.amazon.com/acm/latest/userguide/dns-validation.html


解析生效以后可以使用了


返回到cloudfront重新配置自定义域名应该可以了。


参数解释如下:

设置
价格级别有三类,北美与欧洲、北美欧洲加亚太非、全球加速,不同类别应用到的 PoP 点不同,对应价格也不一样。
AWS WAF Web ACL如果配置了 WAF,可以在此关联,当然 CloudFront Distribution 创建完成后也可以在WAF Console关联。
备用域名(CNAMEs)(若使用自己域名,该项是必须项)CloudFront Distribution 创建完成后,CloudFront 会提供一个以 cloudfront.net 结尾的域名,如果需要使用自己的域名的话,需要在此处填写待使用的域名。
自定义SSL证书支持用户使用自己域名的证书,需要与上一栏域名匹配。可以使用 Amazon ACM 申请证书,需要注意的是,需要在 us-east-1 区域下的 ACM 申请才能应用到 CloudFront。支持 dedicate IP 和 SNI 两种模式。
支持的 HTTP 版本可以启用HTTP/2的支持。
默认根对象可以指定默认指向的文件名,例如:index.html
标准日志记录标准访问日志记录,建议开启。日志开启还需要选择存放的S3桶。
IPv6是否支持IPv6。

点击 创建分配 后,来到 分发 的列表页面,可以看到状态是“In Process”,大概10分钟左右看到状态是“已启用”时,则表示该分配创建完成,可以使用,并且可见到 CloudFront 为其分配的域名,例如xxxxxxx.cloudfront.net,如果需要使用自己的域名,需要在自己域名的DNS管理中,添加DNS解释,把域名 CNAME 到 CloudFront分配的域名,例如此处的xxxxxxx.cloudfront.net,添加后就可以使用自己域名进行访问了。

cloudfront 在访问的时候遇到了502的问题,

cloudfront wasn’t able to connect to the origin. we can’t connect to the server for this app or website at this time…..

源站访问不到,跨域问题出现了

调出cloudfront行为选项开始调整创建行为,路径默认* 源请求策略名称,修改为

Managed-CORS-CustomOrigin,缓存策略名称:Managed-CachingDisabled,查看器协议策略将http强制跳转为https;


参数解释如下:

默认缓存行为
路径模式默认是 * ,就是全部匹配。支持通配符 * 代表0或多个字符,? 代表完全匹配一个字符。注意路径模式是区分大小写的。例如 image/*.jpg 代表image目录下的所有jpg文件都遵循这个缓存行为。
自动压缩对象是否在客户端支持的时候,返回源站文件的压缩版本,以优化体验。注意还需要在下面的缓存策略中,勾选使用 GZip 或 Brotli 压缩算法。
查看器协议策略允许客户端访问CloudFront时使用的协议,支持 HTTP 和 HTTPS,并且提供重定向 HTTP 到 HTTPS。
允许的 HTTP 方法允许的 HTTP 动作,不同的 行为 可以配置不同的选项。
限制查看器访问是否使用签名的 URL 或签名的 Cookie 才能访问,也就是常说的防盗链技术。
缓存键和源请求如何进行源的缓存,以及如何区分不同的缓存,通过这两个设置进行。这里有两种方式,一种是通过缓存策略和源请求策略共同确定,另一种旧的遗留策略,不推荐使用。下面将会详细介绍如何通过缓存策略和源请求策略确定缓存的情况。
响应标头策略通过响应标头策略,可以实现安全相关需求和获取更多的统计信息,下面将会详细介绍。
其他设置可以设置IIS的平滑流,字段级加密,以及实时访问日志流配置。

策略配置

下面介绍上面提到的三个关键的策略配置:

· 缓存策略

缓存策略用于决定内容是否进行缓存,以及缓存的时间。CloudFront默认提供了多种缓存托管策略,可以直接选择使用,也可以根据需要自定义缓存策略来使用,默认提供的托管策略如下:

托管 缓存策略
CachingOptimized适用于静态网站加速的场景。源站不会因为不同用户、不同终端等返回不同的内容,内容默认进行了压缩。
CachingOptimizedForUncompressedObjects和上面策略相同,但不进行压缩。
CachingDisabled适用于动态内容,或不可缓存的内容。
Elemental-MediaPackage为Amazon Elemental MediaPackage服务配置的策略。
Amplify为Amazon Amplify Web应用程序配置的策略。

如果需要自定义缓存策略,各个设置项如下:

自定义 缓存策略
TTL设置最短TTL:CloudFront在到达这个时间后,会向源请求以确认缓存是否最新。默认TTL:如果源的内容没有指定Cache-Control或Expires标头时,CloudFront会按这个值设置缓存过期时间。最长TTL:当源的内容指定了Cache-Control或Expires标头时,设置缓存过期时间为标头和最长TTL中的最小值。注意,这三个值只影响CloudFront回源和缓存的行为,向客户端返回的缓存标头以源站返回的标头为准。
缓存键设置该设置指定在缓存源站内容时,应该用哪些关键键值进行区分不同内容,分别进行缓存。标题:无 表示不需要区分不同的Http Header标头。可以通过 包括以下标题 选择需要区分的Http Header标头。查询字符串:无 表示不需要区分不同查询字符串的回源。全部 表示需要带上所有查询字符串进行缓存区分。包括/排除指定字符串 表示包括或排除对应的字符串来区分缓存。Cookie:和查询字符串类似,但是是处理Cookie里包含的值。
压缩支持可以开启GZip和Brotli压缩,注意选择了 自动压缩对象 后才会生效。

· 源请求策略

源请求策略用于设置回源请求时的行为,CloudFront默认提供了多种源请求托管策略,可以直接选择使用,也可以根据需要自定义源请求策略来使用,默认提供的托管策略如下:

托管 源请求策略
UserAgentRefererHeaders仅包含User-Agent和Referer标头,可以统计客户来源。
CORS-CustomOrigin包含Origin标头,适用于自定义源启用跨源资源共享 CORS。
CORS-S3Origin适用于S3源启用跨源资源共享 CORS。
AllViewer适用于动态请求的源站,源站可以获取查询字符串和Cookie等信息。
Elemental-MediaTailor-PersonalizedManifests适用于Amazon Elemental MediaTailor 终端节点的源

如果需要自定义源请求策略,各个设置项如下:

自定义 源请求策略
标题定义回源时,怎样设置Http Header。无:不使用Http Header标头进行回源请求。包括以下标题:选择指定的Http Header标头进行回源。所有查看器标题和以下CloudFront标题:CloudFront可以判断一些常用的情况,并进行标识,例如客户端是否是手机,客户端访问的国家标识等。所有查看器标题:传递客户端的所有标题。默认情况下,源站收到 CloudFront的请求中的 Host 字段值为 源站 设置中的源站域名,如果用户的源站需要拿到客户端发来的 Host 字段的值(即用户 CNAME 到该分配的域名),在此处就需要将 Host 添加到白名单,此时源站将收到客户端发出请求时的域名。
查询字符串定义回源时,怎样设置Url上问号后的参数。无:表示不带任何字符串回源。全部:表示带上所有查询字符串回源。包括指定字符串:表示包括对应的字符串回源。
Cookie定义回源时,怎样设置Cookie值。无:表示不带任何Cookie回源。全部:表示带上所有Cookie回源。包括指定Cookie:表示包括对应的Cookie回源。

· 响应标头策略

响应标头策略用于返回给客户端内容时,增加特殊的Http Header标头,实现对应功能。CloudFront默认提供了多种响应标头托管策略,可以直接选择使用,也可以根据需要自定义响应标头策略来使用,默认提供的托管策略如下:

托管 响应标头策略
SimpleCORS允许来自任何源的简单 CORS 请求(添加标头:Access-Control-Allow-Origin: *)。
CORS-With-Preflight支持CORS的预检请求(Http的OPTIONS方法)。
SecurityHeadersPolicy添加一组安全标头。
CORS-and-SecurityHeadersPolicy添加CORS标头和安全标头。
CORS-with-preflight-and-SecurityHeadersPolicy添加CORS,预检和安全标头。

如果需要自定义响应标头策略,各个设置项如下:

自定义 响应标头策略
跨源资源共享 (CORS)配置CORS相关设置。如果源提供了CORS相关设置,且没有选择 源覆盖,则会把源的设置返回到客户端。
安全标头多种安全相关标头,可以进行自定义设置。
自定义标头可以设置自定义的标头。
服务计时标头可以提供CloudFront是否命中缓存,回源点,各级回源所用时间等信息。可以设置采样的百分比。

用s3作为源站:

点击分配的 ID,可见当前分配的相关设置,点击 “源”,可以看到当前的源站设置,点击 “创建源”,可以添加一个源站。


注意选择 S3 桶为源站时,会出现S3存储桶访问的“使用OAI”选项,我们知道 S3 通过 ACL 和 Bucket Policy 控制存储桶的对象是否被公开访问,因此该 S3 存储桶需要允许 CloudFront 能够从 S3 存储桶拉取对象,因此这里有两种方式,一个是该桶设置为公开访问桶,任何人可以直接从该桶下载,而另一种方法是使用 OAI(Origin Access Identity),即该 分配 获取一个 OAI,并且在 S3 bucket policy 中的 principle 部分填写该 OAI,这样该 S3 存储桶将仅向该分配开放了相应的权限,而其他人无法直接从该存储桶下载资源,建议选择“是的,使用OAI”以避免 Bucket Policy 配置错误。

缓存优化

本节将介绍常见的 TTL 设置建议、动态加速,设置样例以及错误处理。

TTL 设置建议

CloudFront 在计算 Cache key 时会将请求的 URL 以及当前分配对应的 行为 配置(如是否转发 Header、Cookie、查询字符串)考虑在内,计算出唯一值。因此即使两次请求都是相同的 URL,如果两次请求的个别 Header 不一样,且该 Header 配置为需要区分缓存,则计算出的 Cache key 也不同,返回给客户端的内容自然也不同。因此配置转发的查询字符串、Cookie 及 Header 越少,Cache key 也将越少,缓存命中率就越高,带来的性能也越好。

对于用户内容在 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 值,使用版本号更新内容,内容放置在S3桶中。选择缓存策略:CachingOptimized定期更新的内容设置低 TTL 值。TTL 到期后,CloudFront 回源校验源站内容是否发生变化。经常变化的内容;按请求不同内容不同;设置很低甚至0 TTL。选择缓存策略:CachingDisabled

对于动态内容,动态加速场景,可以在源站设置:

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

对于 Cache-Control Header 设置样例:

静态资源登录页媒体分片动态内容HLS 直播
*.css, *.js, 软件下载,更新包等Index.html/*.ts/*.m3u8
Cache-Control: public; max-age=31536000Cache-Control: no-cache=Set-Cookie; max-age=30Cache-Control: public; max-age=31536000Cache-Control: no-cache; max-age=0;No-store;privateCache-Control: public; max-age=2

配置完成以后分别用源站,aws域名,和自定义域名测试应该都可以下载的,至此AWS cloudfront配置大致结束,具体参数设置可以查看AWS文档。

参考:https://aws.amazon.com/cn/blogs/china/configure-amazon-cloudfront-to-accelerate-the-whole-site/


文章作者: 云上的小雨滴
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 云上的小雨滴 !
评论
  目录