如果你的网站的用户遍布世界各地,而且你的网站有很多静态资源(html, js, css, 图片),那么你一定会想利用 CDN(Content Delivery Network)来加快你的网站的访问速度。关于CDN的基本原理,请看这里。
这里分析一下苹果官网(www.apple.com)的CDN的应用(苹果使用了Akamai作为其CDN服务商)
用户的在主页上搜索macbook的操作流程:
访问苹果主页
在输入框输入关键字"macbook",点击search按钮
实际发生的请求:
向www.apple.com发送请求,返回结果为html页面。
因为html页面包含有css引用代码
<link id="globalheader-stylesheet" rel="stylesheet" href="http://images.apple.com/global/nav/styles/navigation.css" type="text/css" />
紧接着向 images.apple.com 发送请求,得到css文件
当用户点击搜索按钮后,向www.apple.com 发送请求 http://www.apple.com/search/?q=macbook
在整个过程中涉及到二个域名:www.apple.com 和 images.apple.com
dig后发现这两个域名都用CNAME指向了Akamai的DNS服务器
由此可知整个过程的三个请求都是发送到了Akamai CDN服务器,其中两个是请求是静态资源(html和css),已经缓存在了Akamai CDN里,只要缓存没过期,就可以直接返回给用户;一个是动态请求(search/?q=macbook),此时Akamai CDN摇身一变成了代理服务器,每次都把请求转发给apple服务器,如下图。
这里需要指出一点,对动态资源发送请求的时候,每次都通过Akamai CDN进行转发,这样反而会影响网站的性能。那么我们怎么对所有动态资源的请求都绕过Akamai CDN,直接访问Apple的服务器呢?我们观察到apple主页url和搜索表单url都指向相同的域名www.apple.com(这是由于浏览器同源策略的强制规定),所以如果我们想要对动态资源的请求直接访问apple服务器,就只能把 www.apple.com 直接指向apple服务器,这样做的损失就是另一个静态资源:apple的html主页http://www.apple.com/ 也将直接从apple服务器获取,无法从Akamai CDN获取,用户对主页的访问将变慢。修改后如下图。
以上两种方式,Apple选择了第一种方式,大家可以根据自己网站的情况进行选择。
接下来我们通过图解来看一下当访问http://www.apple.com 时,apple主页通过CDN获取html页面的全过程
(1) 用户向电信运营商的本地DNS递归查询服务器(以下简称local telcom DNS)询问 www.apple.com 的ip地址。
(2,3) local telcom DNS向根域名服务器和.com顶级域名服务器进行递归查询apple.com的权威域名服务器地址。
(4,5) local telcom DNS向apple.com权威域名服务器查询www.apple.com 的ip,得到指向Akamai域名的CNAME记录:www.isg-apple.com.akadns.net,该域名由Akamai拥有。接着local telcom DNS向www.isg-apple.com.akadns.net发起DNS查询请求,得到另一个CNAME记录 www.apple.com.edgekey.net ,该域名同样由Akamai拥有。和上一步一样,接着local telcom DNS向www.apple.com.edgekey.net 发起域名查询请求,得到另一个CNAME记录 e3191.dscc.akamaiedge.net ,该域名还是由Akamai拥有(akadns.net, edgekey, akamaiedge.net 都是Akamai控制的域名)。(由上面的dig截图我们知道,e3191.dscc.akamaiedge.net 是最后一次CNAME记录的域名,也是akamai的智能DNS服务器,它能根据用户所处的地理位置和当前网络负载情况给出最合适的服务器ip地址。)
(6,7) local telcom DNS向根域名服务器和.net顶级域名服务器进行递归查询akamaiedge.net的权威域名服务器地址。
(8,9) lcoal telcom DNS向akamaiedge.net的权威域名服务器查询e3191.dscc.akamaiedge.net 的ip, 得到的返回结果为Akamai CDN edge server的ip,一般是离用户地理位置最近的那个edge server服务器。
(10) local telcom DNS将Akamai CDN edge server的ip返回给用户的计算机。
(11) 用户向Akamai CDN edge server发送请求。
(12) Akamai CDN edge server会进行判断:如果是静态资源请求且缓存已经过期,或者是动态资源请求,会向apple源服务器发送请求,否则直接转到(13)。
(13) Akamai CDN edge server将缓存的静态资源或者作为代理转发的动态资源返回给用户。
我们平时看到的对CDN的使用基本就是按照上图的流程来进行的。