一、前言
之前帮别人富强套CDN的时候了解的cloudfront,当时就感觉它和国内主流的CDN有些不同
这几天再次尝试了cloudfront,体验过后感觉cloudfront与国内CDN确实有很大不同,很多功能需要自己设置,对新手不是很友好,当然自定义性更强
本文主要记录使用cloudfront时 设置自定义host的配置记录
另外提一下,本文只是闲着无聊 提供一种思路,个人不建议使用cft 账单更新不及时,即使设置了WAF感觉破产的风险还是挺大的
二、简介
回源协议、回源端口、支持的tls版本可以根据需要自行设置
三、案例演示
例如我用cft给
blog.tanglu.cf
站点加速,让用户在浏览器访问blog.tanglu.cf
时就是cloudfront返回源站的页面我会展示一些可能遇到的问题
1、在源站配置 blog.tanglu.cf 的页面内容
2、申请证书
在搜索栏搜索 AWS Certificate Manager (ACM)
来到证书申请/上传页面,申请/上传证书,我这里为 *.tanglu.cf
申请一个泛域名证书(申请的证书只能在aws内部使用,无法下载)
大概一分钟后就自动颁发成功了
3、在 cloudfront
页面创建服务 Create distribution
①输入解析记录为源站IP的域名,例如 origin-ip.tanglu.cf
当我直接访问 origin-ip.tanglu.cf
时,显示我源服务器nginx的默认界面
这是因为我没有在nginx配置文件 为origin-ip.tanglu.cf
配置服务,源服务器默认返回nginx默认页面
②在 Alternate domain name (CNAME) - optional
填入你需要加速的域名
③设置缓存规则
创建资源时出现如下提示,说明我们要在 Cache key and origin requests
设置一个缓存规则,我测试用所以设置的不缓存
④然后就添加好了CDN
将 blog.tanglu.cf 指向这个CNAME域名,当然你也可以自选IP
⑤访问试试
可以看到访问 http://blog.tanglu.cf
展示的是默认页面,访问 https://blog.tanglu.cf
直接报错
这个问题我猜测是cloudfront默认去掉了客户端的host,用的 origin-ip.tanglu.cf
作为回源host
我测试在源服务器配置了 origin-ip.tanglu.cf
的nginx配置后,再次访问就是 origin-ip.tanglu.cf
的页面证实了cft使用 Origins domain
作为回源 host
⑥允许客户端传递host
为解决第⑤小节中的问题,我最开始是做法将 blog.tanglu.cf
作为 Origins domain
,然后选择另一个域名 blogcft.tanglu.cf
并CNAME到cft给的CNAME域名,让客户端通过 blogcft.tanglu.cf
去访问,但是这样肯定不是我们需要的。
之后查看了 官方文档 才知道需要手动设置来解决这一问题
1、简短描述
要将您的分配配置为将主机标头转发到源,请执行以下操作之一:
- 创建缓存策略和源请求策略。
- 编辑分配中现有行为的设置。
重要提示:对于 Amazon Simple Storage Service (Amazon S3) 源,不支持基于主机标头的缓存。有关更多信息,请参阅选择用作缓存基础的标头。
2、解决方法
创建缓存策略和源请求策略
- 按照以下步骤使用 CloudFront 控制台创建缓存策略。
- 在 Cache key settings(缓存密钥设置)下,为 Headers(标头)选择 Include the following headers(包括以下标头)。从 Add header(添加标头)下拉列表中,选择 Host(主机)。
- 根据要将策略附加到的行为的要求,完成缓存策略的所有其他设置,然后选择 Create(创建)。
- 创建缓存策略后,请按照以下步骤将策略附加到 CloudFront 分配的相关行为。
编辑现有行为的设置
- 打开 CloudFront 控制台,然后选择您的分配。
- 选择 Behaviors(行为)选项卡,然后选择将主机标头转发到的路径。
- 选择 Edit(编辑)。
- 在 Cache key and origin requests(缓存键和源请求)下,确认已选择 Legacy cache(旧缓存)设备。如果未选中,请按照上一节中的步骤创建一个缓存策略。如果选择 Legacy cache settings(旧缓存设置),请完成以下步骤:
对于 Headers(标头),选择 Include the following headers(包括以下标头)。
从 Add header(添加标头)下拉列表中,选择 Host(主机)。- 选择 Save Changes(保存更改)。
保存后再次F5刷新后就可以传递客户端的host给cft了
⑦清除缓存
如果F5强制刷新后还是显示的之前的页面,可能是相关资源cloudfront给你缓存了,你可以用 这个工具 查看资源是否被缓存(记得请求两次哈)
清除cloudfront的缓存步骤如图所示,/*
或者 *
是清楚全部缓存
这个清除只是临时行为(似乎还收费),想对特定文件设置不缓存建议设置对应的规则,下节会继续提到
三、自定义缓存
在开始自定义host之前,先接着上节的清楚缓存写一下如何自定义缓存以及设置缓存时间
本节默认选择的
Legacy cache settings
且已经设置了’允许携带客户端host’当然这个对缓存行为不影响,但是可能影响用户访问行为
缓存相关设置主要有:设置缓存路径、设置缓存时间、设置优先级
1、设置缓存(不缓存)路径
在 cloudfront Distributions
> select your id
> Behaviors
>> create behavior
例如对所有png文件进行设置
2、设置缓存时间
这里的三个TTL我暂时都不是很懂是什么意思,我是直接都设置的一样且很大的一个数(知道的大佬可以告知一下) :)
或许这个对你有帮助:https://stackoverflow.com/questions/51073731/what-is-cloudfront-minimum-ttl-for
如果全设置为0就是不缓存
——
3、设置优先级
优先级从上到下开始匹配,建议最广的全局规则放到最下面(和 cloudflare的WAF防火墙规则 类似)
比如针对 blog.tanglu.cf
站点,缓存设置为:对所有png图片进行缓存、对所有html不缓存、对blog.tanglu.cf/test/
下的png图片不缓存
则优先级应该设置为:
- 优先级0 不缓存 /test/*.png
- 优先级1 缓存 /*.png
- 优先级2 缓存 /*.html
- 优先级3 全局默认配置
4、删除已有缓存
清除cloudfront已有缓存步骤如图所示,/*
或者 *
是清楚全部缓存,你根据需要自己设置
这个清除只是临时行为
官方价格:每月前 1,000 个文件的删除请求不收取额外费用;高于此级别,每增加一个文件就将收取 0.005 美元的费用(注意 /* 往往包含很多个文件)
5、更多缓存策略
比如还可以根据设备类型配置缓存,根据查看者的语言配置缓存,根据查看者的位置配置缓存,根据请求的协议配置缓存
具体可以参考官方文档:https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html
https://repost.aws/zh-Hans/knowledge-center/waf-apply-rate-limit
四、自定义回源host
这节原本是打算使用 Lambda
函数修改回源host,但是能力不够 尝试了一下访问报错了,有知道的老哥可以发邮件教教我。
不过问题不大,使用cloudfront自定义回源请求头中的host字段效果类似于反代,最简单的方法其实在之前的例子中已经提到了:
之前例子中的origin-ip.tanglu.cf
就是一个自定义host,你可以将其换为你需要(反代)的任何资源,比如你可以设置为 存储桶域名 ,之前已经证明过cloudfront回源host就是你在面板设置的 Origin domain
这个满足了大多数场景,不过有还是有少部分场景未能满足,比如域名的实际IP并没有指向你需要的服务器等等。所以想着用 Lambda函数试试,但是最终失败了 :(
⑤访问试试
可以看到访问
http://blog.tanglu.cf
展示的是默认页面,访问https://blog.tanglu.cf
直接报错这个问题我猜测是cloudfront默认去掉了客户端的host,用的
origin-ip.tanglu.cf
作为回源host
我测试在源服务器配置了
origin-ip.tanglu.cf
的nginx配置后,再次访问就是origin-ip.tanglu.cf
的页面证实了cft使用Origins domain
作为回源 host
还是演示个小例子
比如我想用 blog.tanglu.cf
这个域名反代已经存在的站点 blog.tanglu.me
,即让客户端访问 blog.tanglu.cf
得到的内容是我博客的内容
五、禁用客户端对cloudfront_CNAME *.cloudfront.net
的访问
个人用cloudfront的应该不多这里就不做展示了(主要是搞了一天的使用Lambda自定义回源host 失败了 有点伤),感觉挺适合企业的自定义性很强
需要注意web ACL 和 Lambda函数都是计费的
六、杂谈
cloudfront支持CC速率限制等规则,不过是计费的 可在web_ACL中设置,我个人用不到就暂不展示了,有需要可以评论 我后期补上
需要了解cloudfront价格可以参考 Luminous 大佬的教程:https://luotianyi.vc/5994.html