对于本文,开始并不打算写出来,因为aws有非常详细的官方文档,但是对于我本人在使用过程中的体会来说,官网文档并不好理解和阅读,英文难啃,而中文翻译往往又不是完全正确,往往给学习带来误解,有甄别能力的童鞋或许会提个case或者电话咨询一下aws的工程师,而大部分人估计没有这个甄别能力,因此,便有了写此文的动力,抛砖引玉,把理解写出来,希望对他们有些帮助;
注:本文省略了在dns解析服务商配置cname记录的步骤,因为各个DNS解析服务商的配置有些差异,这点估计难不倒大家
Cdn的发明者是akamai,且到目前为止,其仍然是它的主营业务,跨国企业/外贸企业/电商企业对于CDN的首选自然是akamai,不例外,我们公司也是使用的akamai的产品,其效果也相当的不错,售后非常专业;不过,本文今天要说的是cloudFront,除了成本的考虑,或许并没有其他理由去选择CloudFront,所以,本文纯技术而谈,
Akamai似乎并没有太多说的,功能多而广,全球覆盖率广,性能优越,更优的是有专门的售后技术负责支持,唯一的缺点可能是价格稍贵;
CloudFront使用范围过于局限,仅仅使用于ELB和S3;其重心工作是在于缓存,因而其功能稍显不足,具体的功能往往都是需要源站配合来实现;收费成本不高,但是隐性收费项目比较多,出于成本的考虑的话,估计需要再三衡量是否能节约成本;售后服务上,并没有专门的技术提供支持,当然可以购买支持服务,但通常一般企业用不着;
注: 更多的情况,首推akamai; 成本考虑的话,可以考虑CloudFront,单纯使用cdn,不要使用其route53,因为route53是需要额外收取请求费用的,另外对缓存清理要求较高的,也不建议使用,因为其只有1000次免费额度,超出部分,都是需要收取额外费用的;最重要的是,公司必须要有一定的技术实力,才可以驾驭它;
Create Distribution---Origin Settings---Create behavior---Create Invalidation
中文翻译:创建分布—源站设置—创建行为—创建无效(即清理缓存)
输入账号和密码,登陆aws 控制台,点击 CloudFront;
点击 create Distribution,
这里选择的转发方式为web,讨论的也是网站的CDN加速,对流媒体暂不讨论;
看到如上界面,这个界面总共会设计到三个部分的设置:
第一, 源站设置,主要是指定ELB或者S3地址;
第二, 默认缓存行为设置,即默认缓存策略;
第三, 分发设置;
但是在这里,不做具体配置,看下图:
设置好origin Domain Name,其他保持默认,最后点击 create Distribution;
状态显示为In Progress,预计等待15分钟左右….
完成以上动作,初步完成了分发的创建,继续往下看:
这个是刚刚创建的,点击,进去:
点 edit;-------------上图中的Domain Name: dsnsbl39shfl3.cloudfront.net , 便是cname配置所指向的目标地址
Price class: Use All Edge Locations(Best Performance) 推荐使用默认值,也可以根据实际情况选择区域;
AWS WAF Web ACL: WAF是web 应用防火墙,没有使用,保持默认none;
Alternate Domain Names: 配置自定义的域名,比如www.cndirect.com,也就是配置你自己的域名;
SSL Certificate:这个简单,选择安全证书,如果没有,可以先把证书导入到ACM;
这个页面没有太多的说明,其他都保持默认即可;
这个页面,也没有太多需要说明,红色方框的部分注意填写即可,下面方框如果需要支持Http/https,请选择match viewer;
本小节是整个CDN配置的关键和难点,需要认真理会后续逻辑
1 Path Pattern: 路径模式,指定您希望此缓存行为所匹配的请求。CloudFront收到用户请求时,会按照缓存行为在分配中的顺序和路径模式 与 请求路径进行匹配,而决定缓存如何;
匹配原则:
A) 通常第一个匹配,就决定了此请求的缓存行为;
B) 指定的路径模式适用于指定目录以及该目录下所有子目录中所有文件的请求,比如images目录下包括product1和product2子目录,路径模式:images/*.jpg,可以匹配images,images/product1和images/product2目录下的所有jpg文件;
C) 其支持通配符*和 ?,
* matches 0 or more characters 匹配0个或者多个字符,即匹配任意多个字符;
? matches exactly 1 character 匹配单个字符,
2 Viewer Protocol Policy 关注第二项配置,Redirect Http to Https 80端口重定向到443;
3 Cache Based on Selected Request Headers
指定是否需要转发请求的头部回源站,并根据头部信息进行缓存;
ALL 转发所有的头部回源站,但是CloudFront不会缓存任何信息,而是全部回源站;
Whitelist 仅仅转发指定的头部回源站,并缓存;
None CloudFront仅转发默认头部信息回源站,但是它不缓存对象基于头部信息
举例:
手机跳转功能
增加Http头cloudFront-Is-Mobile-Viewer(cloudfront默认已经创建),并转发回源站,然后配置源站nginx,对头部信息进行判断,再实现跳转
Cloudfront关注的重点是数据缓存,至于某些功能上的实现,必须在源站来协助实现,因此配置源站nginx如下:
location / {
index index.html index.htm;
}
if ($http_cloudFront_is_mobile_viewer = true) {
set $mobile_request true;
}
if ($mobile_request = true) {
return 302 http://test-m-t.dresslink.com$request_uri;
break;
}
if ($http_cloudFront_is_Tablet_viewer = true) {
set $Tablet_request true;
}
if ($Tablet_request = true) {
return 302 http://test-m-t.dresslink.com$request_uri;
break;
}
}
5 Object Caching
如果源站增加了cache-control头,对对象设置了保存时长,并且不想改变cache-control所控制的时长,请选择 Use Origin Cache Headers;否则请选择customize.
6 Minimum TTL/Maximum TTL/Default TTL
这部分是控制缓存时长的重点,其匹配逻辑如下:
Origin Configuration | Minimum TTL = 0 Seconds | Minimum TTL > 0 Seconds |
Cloudfront 缓存 取 cache-control max-age 和 Maximum TTL 两者最小值 Browser caching 浏览器缓存时间为cache-control max-age | Cloudfront caching 与max age/ Minimum TTL/Maximum TTL 三者有关: 1. Minimum TTL< max-age < maximum TTL 缓存时间:control-control max age 2. max-age < minimum TTL 缓存时间:minimum TTL 3. max-age >maximum TTL 缓存时间:maximum TTL Browser caching: 缓存时间为:control-control max age | |
不增加cache-control max age | CloudFront caching: 缓存时间:Default TTL Browser caching: 依赖于浏览器缓存策略 | Cloudfront caching: 缓存时间: Minimum TTL与Default TTL最大值; Browser caching: 依赖于浏览器缓存策略 |
增加cache-control max-age和cache-control s-maxage | CloudFront caching: 缓存时间: Cache-control s-maxage和Maximum TTL 之间最小值 Browser caching 缓存时间:cache-control max-age | Cloudfront caching Minimum TTL/Maximum TTL/s-maxage取决于这三者 1. MinimumTTL< s-maxage < maximum TTL 缓存时间:s-maxage 2. s-maxage < minimum TTL 缓存时间: minimum TTL 3. s-maxage > maximum TTL 缓存时间: maximum TTL Browser caching 缓存时间: Cache-Control max-age |
增加expires | Cloudfront caching 缓存时间 Expires和maximum TTL 取最早者 Browser caching 缓存时间:Expires | CloudFront caching 取决于minimum TTL and maximum TTL and the Expires三者 1. Minimum TTL < Expires < maximum TTL 缓存时间:expires 2. Expires < minimum TTL 缓存时间:minimum TTL 3. Expires > maximum TTL 缓存时间:maximum TTL Browser caching 缓存时间:expires |
加Cache-Control: no-cache, no-store, and/or private | CloudFront and browsers respect the headers | Cloudfront caching 缓存时间:minimum TTL Browser caching respect the headers |
7 Query String Forwarding and Caching
CloudFront可以根据字符串缓存不同版本的数据,
None (Improves Caching) 如果无论字符串如何,都返回相同版本的对象,请选择此项;
Forward all, cache based on whitelist 如果源服务器根据一个或多个查询字符串参数返回对象的不同版本,请选择此项;
Query String Whitelist 只支持健,并不支持值,比如可以在方框中输入language,但是并不能支持language=de或者language=en,这点跟akamai区别明显要不同;比如如下链接:
http://d111111abcdef8.cloudfront.net/main.html?language=de
http://d111111abcdef8.cloudfront.net/main.html?language=en
这代表两个不同的链接,会进行缓存;但是在Query String Whitelist中,输入language即可;
Forward all, cache based on all 如果原始服务器的所有查血字符串参数返回不同版本的对象,请选择此项;
8 Compress Objects Automatically
如果你想自动压缩某些类型的文件,当viewer请求的头部信息中包含Accept-Encoding: gzip的时候,请选择yes,也就是说需要压缩的文件请求,必须含有Accept-Encoding: gzip头部信息;
如果您配置CloudFront来压缩您的内容,CloudFront将压缩在Content-Type头文件中具有以下值的文件(即只能压缩以下内容类型的头文件):
application/eot
application/x-otf
application/font
application/x-perl
application/font-sfnt
application/x-ttf
application/javascript
font/eot
application/json
font/ttf
application/opentype
font/otf
application/otf
font/opentype
application/pkcs7-mime
image/svg+xml
application/truetype
text/css
application/ttf
text/csv
application/vnd.ms-fontobject
text/html
application/xhtml+xml
text/javascript
application/xml
text/js
application/xml+rss
text/plain
application/x-font-opentype
text/richtext
application/x-font-truetype
text/tab-separated-values
application/x-font-ttf
text/xml
application/x-httpd-cgi
text/x-script
application/x-javascript
text/x-component
application/x-mpegurl
text/x-java-source
application/x-opentype
如果要压缩CloudFront不支持压缩的文件类型,可以使用gzip将自定义源配置为压缩这些类型的文件。 CloudFront不支持其他压缩算法。当您的起始点将压缩文件返回到CloudFront时,它将包含一个Content-Encoding:gzip标头,它向CloudFront指示该文件已经被压缩。
可以指定单个对象的路径或者以*通配符结尾的路径,表示一个或多个对象;
记住:可以免费提交无效请求1000次,超出次数将收取费用
在CloudFront处理完每一次请求后,该URL的文件会被缓存一定的时间并自动过期,后续的请求CloudFront返回的响应包头中会包含一个叫做“Age”的包头,单位为秒并代表已经缓存的时间,正常情况下“Age”的值会小于等于CloudFront节点缓存文件的时间。您可以通过使用一些访问URL的命令行,例如“curl”访问一些特定的URL并通过参考响应中“X-Cache”包头以及“Age”包头判断请求是否被缓存,以及缓存时间。
注: 建议是在Linux下,用curl命令进行测试;windows,容易受缓存干扰。
原文地址:http://tsykl2008.blog.51cto.com/3973591/1970473