CDN 与 缓存
缓存
这篇文章好 http://www.cnblogs.com/futan/archive/2013/04/21/cachehuancun.html
我们通常意义上说的缓存主要包含两部分。第一个是用户浏览器端的缓存,第二个是服务器端为了提高访问速度而加的CDN。
1、(浏览器缓存)本地缓存
说到浏览器缓存就是指你打开一网页,浏览器会自动下载副本到你的电脑上,就相当于你另存为网页到某个地方而已,只不过这儿是自动而已。当然不会全部内容都会下载,而是有选择的。
插入第一次请求跟第二次有缓存的请求的流程图:
客户端缓存是否需要缓存是可以在服务器端代码上控制的,通过响应头来实现。不存储的情况有如下几点:
(1)如果响应头告诉浏览器不需要缓存,则缓存器就不会缓存相应内容。
(2)如果请求信息需要认证或者是安全加密的,相应的内容不会被缓存;
(3)通过校验响应头来决定是否需要缓存,具体的响应头在下面会讲;
(4)post提交的内容,返回的页面大部分不需要缓存,get返回的数据可以缓存下来;对于post请求在idempotent request请求 (可以理解为简单的查询操作)时,会被缓存。
http头中关于缓存的meta标签
其中 expire和cache-control 控制客服端是否向服务器端发送请求。而last-modified/if-modified-since 和etags/if-none-match 则都会向服务器端发送请求,只是在服务器端判断所请求的内容是否已经过期而已。
(1)如果从服务器端返回的响应中,如果不存在expires或者cache-control参数,则浏览器不会存储任何副本;
expires头部字段提供一个日期和时间,响应在该日期和时间之后,则认为失效,失效的副本是不会被存储的;
(2)cache-control 这个字段用于指定所有缓存机制在整个请求、响应中必须服从的命令,这些命令指定用于阻止缓存对请求或者响应造成不利于干扰的行为,这些指令通常覆盖默认缓存算法。cache-control 里面有一个max-age (比如60s),这个优先级最高。如果这个没过期,后面几个参数直接不用看。
缓存指令是单向的,cache-control 是服务器端对浏览器缓存行为的控制。
cache-control 是关于浏览器的最重要的设置,因为它覆盖其他设置,比如expires 和 last-modified。
(3)当一份从服务器返回数据中包含last-modified,则浏览器基于此信息,通过添加一个if-Modified-Since 请求参数,向server 查询,这个副本从上次查看后是否被修改了。
last-modified 和 if-modified-since 都是用于记录页面是否过期的http头信息,只是last-modified 是由服务器发送给客户端的,而if-modified-since 是从客户端发送给服务器端。
(4)Etag 服务器生成唯一标示符Etag,每次副本的标签都会变化,由于server 控制了Etag如何生成,缓存服务器可以通过if-None-Match 请求,如果返回没变,则当前副本与原副本完全一致。
etag的请求过程:
1)第一次客户端请求页面A
2)服务器将页面A以及etags一起发送给客户端;
3)客户端展现页面A并且将etags存储在缓存中;
4)客户端再次请求页面A,会将上次缓存中的etags一起发送给服务器;
5)服务器检查etags ,并判断当前页面自从上次请求之后是否已经改变过,如果没有,则直接返回一个304和一个空的响应体。
etag 主要解决了一些last-modified无法解决的问题:
1)一些文件可能周期性的改变,但是他的内容并没有改变(仅仅改变的时间),这个时候我们不需要客户端认为这个文件做了改变了;
2)某些文件更改比较频繁,比如一秒内改变了无数次,if-modified-since 能检测到的变化时以秒为单位,这种修改无法判断
3)某些服务器不能精确地得到文件的最后修改时间
如果etag跟if-modified-since一起使用,会先判断是否有etag,然后才判断if-modified-since。而last-modified 的优先级又高于expires.
2、cdn 缓存(服务器端缓存)
cdn的原理以及图示
cdn的原理:在用户和服务器之间增加cache层,通过接管DNS,将用户的请求引导到cache上获得服务器的资源。cdn主要包括两部分:负载均衡服务器和高速缓存服务器。
用户通过浏览器等方式访问网站的过程如图所示。
①用户在自己的浏览器中输入要访问的网站域名。
②浏览器向本地DNS服务器请求对该域名的解析。
③本地DNS服务器中如果缓存有这个域名的解析结果,则直接响应用户的解析请求。
④本地DNS服务器中如果没有关于这个域名的解析结果的缓存,则以递归方式向整个DNS系统请求解析,获得应答后将结果反馈给浏览器。
⑤浏览器得到域名解析结果,就是该域名相应的服务设备的IP地址。
⑥浏览器向服务器请求内容。
⑦服务器将用户请求内容传送给浏览器。
在网站和用户之间加入CDN以后,用户不会有任何与原来不同的感觉。最简单的CDN网络有一个DNS服务器和几台缓存服务器就可以运行了。一个典型的CDN用户访问调度流程如图所示。
①当用户点击网站页面上的内容URL,经过本地DNS系统解析,DNS系统会最终将域名的解析权交给CNAME指向的CDN专用DNS服务器。
②CDN的DNS服务器将CDN的全局负载均衡设备IP地址返回用户。
③用户向CDN的全局负载均衡设备发起内容URL访问请求。
④CDN全局负载均衡设备根据用户IP地址,以及用户请求的内容URL,选择一台用户所属区域的区域负载均衡设备,告诉用户向这台设备发起请求。
⑤区域负载均衡设备会为用户选择一台合适的缓存服务器提供服务,选择的依据包括:根据用户IP地址,判断哪一台服务器距用户最近;根据用户所请求的URL中携带的内容名称,判断哪一台服务器上有用户所需内容;查询各个服务器当前的负载情况,判断哪一台服务器尚有服务能力。基于以上这些条件的综合分析之后,区域负载均衡设备会向全局负载均衡设备返回一台缓存服务器的IP地址。
⑥全局负载均衡设备把服务器的IP地址返回给用户。
⑦用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。如果这台缓存服务器上并没有用户想要的内容,而区域均衡设备依然将它分配给了用户,那么这台服务器就要向它的上一级缓存服务器请求内容,直至追溯到网站的源服务器将内容拉到本地。
DNS服务器根据用户IP地址,将域名解析成相应节点的缓存服务器IP地址,实现用户就近访问。使用CDN服务的网站,只需将其域名解析权交给CDN的GSLB设备,将需要分发的内容注入CDN,就可以实现内容加速了。
cdn的限制:其缺点也很明显:当网站更新时,如果CDN节点上数据没有及时更新,即便用户再浏览器使用Ctrl +F5的方式使浏览器端的缓存失效,也会因为CDN边缘节点没有同步最新数据而导致用户访问异常。这个时候需要我们在服务器端对CDN做强制更新。
参考文献:
https://www.douban.com/note/309710090/?type=rec#sep浏览器缓存机制详解
http://www.cnblogs.com/shytong/p/5456698.htmlCDN的实现原理
http://blog.csdn.net/coolmeme/article/details/9468743CDN的实现原理2
http://www.51testing.com/html/28/116228-238337.htmlhttp头信息中有关缓存的几个标签
http://www.cnblogs.com/Leo_wl/p/5686610.htmlhttp缓存与CDN缓存
http://www.cnblogs.com/ziyunfei/archive/2012/11/16/2772729.htm
304 响应
https://www.douban.com/note/161120791/304响应
http://www.cnblogs.com/czh-liyu/archive/2011/06/22/2087113.htmlif-modified-since 和etags/if-none-match 的对比分析
https://my.oschina.net/u/2617218/blog/674317 get post与缓存的关系
https://www.zhihu.com/question/22883627 etag跟last-Modified 比较