+86 135 410 16684Mon. - Fri. 10:00-22:00

AWS企业实战之CloudFront的配置

AWS企业实战之CloudFront的配置

AWS企业实战之CloudFront的配置

Amazon CloudFront 是一项内容传输 Web 服务。它可与其他 Amazon Web Services 产品集成,帮助开发人员和企业在低延迟、高数数据传输、无最低使用承诺的环境下向最终用户轻松发布内容。CloudFront 可使用全球节点网络发布您的整个网站,包括动态、静态、流媒体和交互内容。对您的网站内容的请求将自动路由到最近节点,实现内容发布性能最佳。

简单来说,Amazon云旗下的CloudFront是一个内容分发系统,用于帮助用户缓存站点内容,在客户请求服务时就近分发。

之所以去探究它的缓存机制,是因为在最近工作过程中,使用了CloudFront服务,但是对它的缓存刷新机制并不是很清除,导致在工作中出现疑惑。于是我就去调研了一下这个服务的缓存机制。

在官方说明文档(页面链接)中描述如下:

Typically, CloudFront serves an object from an edge location until the cache duration that you specified passes—that is, until the object expires. After it expires, the next time the edge location gets a user request for the object, CloudFront forwards the request to the origin server to verify that the cache contains the latest version of the object. The response from the origin depends on whether the object has changed:

  • If the CloudFront cache already has the latest version, the origin returns a 304 status code (Not Modified).
  • If the CloudFront cache does not have the latest version, the origin returns a 200 status code (OK) and the latest version of the object.

If an object in an edge location isn’t frequently requested, CloudFront might evict the object—remove the object before its expiration date—to make room for objects that have been requested more recently.

可以用以下流程图表示:

1511751272-2669-CloudFront

AWS通过以上逻辑来对图片更新做出反应,保证用户在刷新缓存后一定能够获得最新的图片。默认的缓存时间为1天,有两种模式可以选择

1、继承源服务器头部信息

2、手动指定缓存时间

当前我所使用的为第一种模式,即继承源服务器头部信息。下面给出一次访问实例。例如访问网站的一个网页:

1511751273-4587-02

我们可以看到,返回的头部状态码为304,即已经缓存。下面查看具体的返回头信息:

1511751273-1365-02

可以看到X-Cache处为cloudfront,即从CloudFront取得缓存。Server为openresty,max-age为在服务器上自定义的86400s。可以看出,确实是从服务器处继承了头部信息。

如果需要自定义缓存时间,则需要在AWS的CloudFront控制面板进行修改:

1511751272-9973-02

选择Behaviors,点击Edit,自定义其中Cache模式为Customize并自定义时间

1511751272-5463-02

CloudFront具有非常智能化的缓存管理机制,在使用默认配置的情况下即可拥有很好的用户体验。但是在定制化方面设置不够人性化,在不阅读文档的情况下很难了解其中具体的信息。

 

1、 背景需求

Cdn的发明者是akamai,且到目前为止,其仍然是它的主营业务,跨国企业/外贸企业/电商企业对于CDN的首选自然是akamai,不例外,我们公司也是使用的akamai的产品,其效果也相当的不错,售后非常专业;不过,本文今天要说的是cloudFront,除了成本的考虑,或许并没有其他理由去选择CloudFront,所以,本文纯技术而谈,

2、 Akamai和cloudfront比较

Akamai似乎并没有太多说的,功能多而广,全球覆盖率广,性能优越,更优的是有专门的售后技术负责支持,唯一的缺点可能是价格稍贵;

CloudFront使用范围过于局限,仅仅使用于ELB和S3;其重心工作是在于缓存,因而其功能稍显不足,具体的功能往往都是需要源站配合来实现;收费成本不高,但是隐性收费项目比较多,出于成本的考虑的话,估计需要再三衡量是否能节约成本;售后服务上,并没有专门的技术提供支持,当然可以购买支持服务,但通常一般企业用不着;

注: 更多的情况,首推akamai; 成本考虑的话,可以考虑CloudFront,单纯使用cdn,不要使用其route53,因为route53是需要额外收取请求费用的,另外对缓存清理要求较高的,也不建议使用,因为其只有1000次免费额度,超出部分,都是需要收取额外费用的;最重要的是,公司必须要有一定的技术实力,才可以驾驭它;

3、 CloudFront配置流程

Create Distribution—Origin Settings—Create behavior—Create Invalidation

中文翻译:创建分布—源站设置—创建行为—创建无效(即清理缓存)

4、 Create Distribution

输入账号和密码,登陆aws 控制台,点击 CloudFront;

1511751275-7547-clip-image002-thumb1

点击 create Distribution,

1511751274-7422-clip-image004-thumb1

这里选择的转发方式为web,讨论的也是网站的CDN加速,对流媒体暂不讨论;

1511751276-9113-clip-image006-thumb1

看到如上界面,这个界面总共会设计到三个部分的设置:

第一, 源站设置,主要是指定ELB或者S3地址;

第二, 默认缓存行为设置,即默认缓存策略;

第三, 分发设置;

但是在这里,不做具体配置,看下图:

1511751276-6942-clip-image008-thumb1

设置好origin Domain Name,其他保持默认,最后点击 create Distribution;

1511751276-1567-clip-image010-thumb

状态显示为In Progress,预计等待15分钟左右….

5、 Distribution Settings

完成以上动作,初步完成了分发的创建,继续往下看:

1511751277-3360-clip-image012-thumb

这个是刚刚创建的,点击,进去:

1511751277-2897-clip-image014-thumb

点 edit;————-上图中的Domain Name: dsnsbl39shfl3.cloudfront.net   , 便是cname配置所指向的目标地址

1511751278-4805-clip-image016-thumb

Price class: Use All Edge Locations(Best Performance) 推荐使用默认值,也可以根据实际情况选择区域;

AWS WAF Web ACL: WAF是web 应用防火墙,没有使用,保持默认none;

Alternate Domain Names: 配置自定义的域名,比如www.cndirect.com,也就是配置你自己的域名;

SSL Certificate:这个简单,选择安全证书,如果没有,可以先把证书导入到ACM;

这个页面没有太多的说明,其他都保持默认即可;

6、 Origin Settings

1511751279-3366-clip-image018-thumb

1511751279-1140-clip-image020-thumb

这个页面,也没有太多需要说明,红色方框的部分注意填写即可,下面方框如果需要支持Http/https,请选择match viewer;

7、 Create behavior

本小节是整个CDN配置的关键和难点,需要认真理会后续逻辑

1511751279-3773-clip-image022-thumb

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 匹配单个字符,

1511751280-4950-clip-image024-thumb

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,对头部信息进行判断,再实现跳转

1511751280-3680-clip-image026-thumb

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;

}

}

1511751280-7611-clip-image028-thumb

5 Object Caching

如果源站增加了cache-control头,对对象设置了保存时长,并且不想改变cache-control所控制的时长,请选择 Use Origin Cache Headers;否则请选择customize.

6 Minimum TTL/Maximum TTL/Default TTL

这部分是控制缓存时长的重点,其匹配逻辑如下:

1511751273-5990-image

1511751275-2682-image1

7 Query String Forwarding and Caching

CloudFront可以根据字符串缓存不同版本的数据,

None (Improves Caching) 如果无论字符串如何,都返回相同版本的对象,请选择此项;

Forward all, cache based on whitelist 如果源服务器根据一个或多个查询字符串参数返回对象的不同版本,请选择此项;

1511751280-4350-clip-image030-thumb

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指示该文件已经被压缩。

8、 Create Invalidation

可以指定单个对象的路径或者以*通配符结尾的路径,表示一个或多个对象;

记住:可以免费提交无效请求1000次,超出次数将收取费用

9、 缓存测试

在CloudFront处理完每一次请求后,该URL的文件会被缓存一定的时间并自动过期,后续的请求CloudFront返回的响应包头中会包含一个叫做“Age”的包头,单位为秒并代表已经缓存的时间,正常情况下“Age”的值会小于等于CloudFront节点缓存文件的时间。您可以通过使用一些访问URL的命令行,例如“curl”访问一些特定的URL并通过参考响应中“X-Cache”包头以及“Age”包头判断请求是否被缓存,以及缓存时间。

注: 建议是在Linux下,用curl命令进行测试;windows,容易受缓存干扰。