说明:本文是在亚马逊AWS英文文档的基础上翻译并整理而来。

1 CloudFront介绍

CloudFront是亚马逊AWS提供的一种公共网络服务。

1.1 什么是CloudFront

CloudFront是一种提供给最终用户的能够加快静态、动态网络内容(例如:htmlcssphp、图片等文件)的分发的Web服务。CloudFront通过Edge Locations的互联网分发Web内容。

1.2 为什么需要CloudFront

当最终用户通过CloudFront请求Web内容的时候,用户的请求将会路由到距用户最近的Edge Location,这样就提供的最低的延时、最好的性能,提高了用户体验。如果被用户请求的内容正好是在该Edge Location的话,那么CloudFront会马上返回这些内容。如果不在该Edge Location的话,那么CloudFront就会从亚马逊S3bucket中或者一个HTTP服务器里面去获取这些数据,然后传输给用户,并且会将这些数据在该Edge Location中缓存起来(默认缓存24小时),以供下次请求时使用。

1.3 CloudFront的一些概念

1.3.1 Objects

Objects就是需要CloudFront分发的文件。一般包括:网页、图片、媒体文件,也可以是可以被HTTP协议和Adobe RTMP协议提供的任意实体。

1.3.2 Origin Server

存放原始的、最终版本的Objects的地方。通常有两种:亚马逊S3bucketHTTP服务器。但是需要注意的是,如果使用RTMP协议提供媒体文件的话,就只能使用亚马逊S3了。

1.3.3 Distributions

Origin Server上存储了对象之后,就可以创建一个distribution了,它主要是告诉CloudFront对象存在哪里。创建成功之后,CloudFront会返回一个唯一的域名,用来引用存储在Origin Server上的对象。例如:dfk0239dhj2gh2.cloudfront.net

假如之前你存储在亚马逊S3上的一个对象URL为:http://mybucket.s3.amazonaws.com/p_w_picpaths/logo.jpg,在使用了CloudFront之后,URL就会变为:http:// dfk0239dhj2gh2.cloudfront.net/p_w_picpaths/logo.jpg

目前,CloudFront提供了2distribution

1.DownloadDistribution:可以采用HTTPHTTPS协议进行传输;最多10origin serversS3buckets或者自定义的server);

2.StreamingDistribution:采用Adobe Flash MediaServerRTMP协议;只能使用S3作为origin server

1.3.4 Edge Location

是指CloudFront提供的地理位置上不同的保存对象的缓存副本的地点。

AWS提供的Edge Locations名录请见附录一。

1.3.5 Expiration

默认情况下,在Edge Location上面保存的缓存副本将会在24小时之后过期。当对象过期之后,如果CloudFront接收到该对象的请求时,会去Origin检查该对象是否被更新过。如果更新过的话,origin会返回最新版本的对象。CloudFront会将这些对象返回给最终用户,并且保存最新版本的对象。

过期时间是可以设置的,最小过期时间为0秒,无最大过期时间限制。

1.3.6 Eventual Consistency

当初建、修改、删除一个Distribution的时候,需要花费一点时间(15分钟以内)才会使改变生效的。Distribution的信息是最终一致的,但是distribution的信息的改变不会马上被呈现出来,这需要几分钟时间。一致性一般会在几分钟之内就会达到,但是在高负载的系统或者网络分区中可能需要的时间会长一些。

1.4 CloudFront是怎么分发内容的

步骤如下:

1.配置origin服务器,包括:亚马逊S3bucketHTTP服务器;

2.上传文件到origin服务器中;

3.创建一个CloudFrontdistribution,当最终用户请求数据的时候,distribution将会通知CloudFront去哪个origin服务器上去获取数据并返回给用户;

4.CloudFront返回一个唯一的域名,可以用来部署网站或者应用程序;

5.CloudFrontdistribution的信息同步到所有的Edge Locations中去;

6.使用步骤4中返回的域名部署网站或者应用程序,也可以使用自己的域名部署,这取决于怎么配置的distribution

还可以配置对象缓存在Edge Location中保存的时间,默认是24小时。

7.一个最终用户通过部署的网站或者应用程序请求一个图片和一个html文件;

8.CloudFront决定采用哪一个Edge Location去响应用户的请求,一般会采用离用户最近的那个,以提高访问速度。这里假如选择了新加坡Edge Location

9.在新加坡Edge LocationCloudFront检查请求文件的缓存。如果存在的话,就直接返回给用户。如果不存在的话,CloudFront将会做如下操作:

a)CloudFront比较请求和distribution中定义的规格,并发送请求到配置origin server中请求数据;

b)Originserver将数据发送到在新加坡Edge Location

c)一旦数据开始从origin server传输过来,CloudFront就开始给用户返回数据。同时,CloudFront会将数据添加到新加坡Edge Location的缓存中。

10.对象在Edge Location中的缓存过期之后,如果CloudFront接收到该对象的请求时,会去Origin检查该对象是否被更新过。如果更新过的话,origin会返回最新版本的对象。CloudFront会将这些对象返回给最终用户,并且保存最新版本的对象。

2 CloudFront使用

2.1 注册亚马逊AWS账号

http://aws.amazon.com/上面注册一个亚马逊AWS的账号,如果已有账号,直接登录即可。

2.2 上传文件到S3并设置权限

在亚马逊S3中,bucket(桶)是一个存储文件和文件夹的容器。CloudFront基本上可以分发所有存储在S3中的数据,包括:文本文件、图片、视频等等。也可以创建多个bucket,并且在S3中数据的数量是不限制的。

默认情况下,S3中的数据都是私有的,如果想要任何人都可以读取摸一个对象,则需要为其加上Public_Read的权限。

文件上传到S3之后,URL将会是如下的样例:http://s3.amazonaws.com/mybucket001/filename。其中mybucket001bucket名字,filename是上传的文件名。

2.3 创建一个CloudFront Download Distribution

访问https://console.aws.amazon.com/cloudfront/,点击“Create Distribution”,选择“Download”类型的分发方法,然后就可以按照操作提示进行操作了,具体操作步骤可以参考CloudFront开发者指南。

2.4 测试刚创建的CloudFront链接

需要注意的是,只有当distribution的状态变为“Deployed”的时候才可以开始测试。

将下面的内容拷贝到一个文件中,后缀名为.html

<html>

<head>My CloudFront  Test</head>

<body>

<p>My test content goes  here.</p>

<p><img src="http://<domain name>/<object name>"  alt="my test p_w_picpath" />

</body>

</html>

将其中的<domain name><object name>换成实际的域名和文件名即可。

在浏览器里面打开这个html文件,查看内容是否显示出来,如果正常显示则可以说明已经部署OK了。如果未显示出来,则需要检查之前的步骤是否操作正确,或者可以调试一番,具体请参考CloudFront开发者指南。

附录

3.1 附录一 Edge Locations列表

To deliver content toend users with lower latency, Amazon CloudFront uses a global network of edgelocations. Amazon CloudFront edge locations are located in:

United States

Europe

Asia

South America

*Ashburn, VA (2)

*Dallas/Fort Worth, TX (2)

*Hayward, CA

*Jacksonville, FL

*Los Angeles, CA (2)

*Miami, FL

*New York, NY (3)

*Newark, NJ

*Palo Alto, CA

*San Jose, CA

*Seattle, WA

*South Bend, IN

*St. Louis, MO

*Amsterdam, The Netherlands (2)

*Dublin, Ireland

*Frankfurt, Germany (2)

*London, England (2)

*Madrid, Spain

*Milan, Italy

*Paris, France (2)

*Stockholm, Sweden

*Hong Kong, China (2)

*Osaka, Japan

*Seoul, Korea

*Singapore (2)

*Sydney, Australia

*Tokyo, Japan (2)

*São Paulo, Brazil