登录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=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 |
配置完成以后分别用源站,aws域名,和自定义域名测试应该都可以下载的,至此AWS cloudfront配置大致结束,具体参数设置可以查看AWS文档。
参考:https://aws.amazon.com/cn/blogs/china/configure-amazon-cloudfront-to-accelerate-the-whole-site/