我说一个简单的CDN实现方式,BIND(DNS)的view 加 varnish(具有反向代理功能的缓存应用) 实现的CDN缓存。当 Client 发起对 www.test.com 的DNS解析的时候。www.test.com的DNS服务器可以通过view来实现不同的网段解析出不同的IP。而这个IP指向的是 Varnish Cache Server,Varnish 可以通过反向代理将用户请求代理到 原始服务器。而它在代理的时候,就需要指明后端backend server(原始服务器),可以是一个或者多个,多个可以组成组,组可以用多种调度算法进行调度。而varnish自身有很强的缓存机制。可以通过配置其vcl来控制其缓存策略。这样访问到达,缓存有且没有过期。且client 请求报文首部中没有Cache-Control: no-cache,它就可以直接从缓存中拿数据进行响应。1、CDN缓存如何通过域名来获取到相应的资源文件?答:CDN缓存自己使用IP进行调度。写域名最主要的原因是解析到缓存服务器。而CDN服务商运行的缓存服务器上面有很多站点的缓存。你不指定域名,谁知道你要命中的 index.html 之类的资源是哪个站点的。2、资源更新答:资源更新一般是通过http首部进行控制。 `http 1.0` 是通过: `Expires首部` 。现在打开 `Chrome` 或者 `firefox` 的调试功能就可以看到 `Expires: Thu, 19 Nov 1981 08:52:00 GMT` 这个首部表示该缓存的有效期限。如果Client的时间不对的话。。。。。所以主流控制不是它。 `HTTP 1.1` 是通过 `Cache-Control` 进行控制 Cache-Control: 请求: no-cache(不要缓存的实体,要求现在从WEB服务器去取) max-age:(只接受 Age 值小于 max-age 值,并且没有过期的对象) max-stale:(可以接受过去的对象,但是过期时间必须小于 max-stale 值) min-fresh:(接受其新鲜生命期大于其当前 Age 跟 min-fresh 值之和的缓存对象) 响应: public(可以用 Cached 内容回应任何用户) private(只能用缓存内容回应先前请求该内容的那个用户) no-cache(可以缓存,但是只有在跟WEB服务器验证了其有效后,才能返回给客户端) max-age:(本响应包含的对象的过期时间) ALL: no-store(不允许缓存) must-revalidate 告诉缓存服务器,每次使用缓存的时候都必须去原始服务器上面做有效性验证 还有一种控制策略:`ETag: "3bf53-548a2478edc80"` 这个`ETag`基本相当于版本的意思,如果`ETag` 好了,我自己也有点糊涂了。 说重点,控制更新是 先判断缓存时长,如果没有过期。就直接使用 Cache-Control: max-age=300 如果过期,就去后端询问是否改变。 ETag + If-None-Match 给你一张varnish的state engine图。
我说一个简单的CDN实现方式,
BIND(DNS)的view
加varnish(具有反向代理功能的缓存应用)
实现的CDN缓存。当 Client 发起对
www.test.com
的DNS解析的时候。www.test.com
的DNS服务器
可以通过view
来实现不同的网段解析出不同的IP。而这个IP指向的是Varnish Cache Server
,Varnish
可以通过反向代理将用户请求代理到原始服务器
。而它在代理的时候,就需要指明后端backend server(原始服务器)
,可以是一个或者多个,多个可以组成组,组可以用多种调度算法进行调度。而varnish
自身有很强的缓存机制。可以通过配置其vcl
来控制其缓存策略。这样访问到达,缓存有且没有过期。且client 请求报文首部中没有Cache-Control: no-cache
,它就可以直接从缓存中拿数据进行响应。1、CDN缓存如何通过域名来获取到相应的资源文件?
答:CDN缓存自己使用IP进行调度。写域名最主要的原因是解析到缓存服务器。而CDN服务商运行的缓存服务器上面有很多站点的缓存。你不指定域名,谁知道你要命中的 index.html 之类的资源是哪个站点的。
2、资源更新
答:资源更新一般是通过http首部进行控制。
给你一张
varnish
的state engine
图。