Web前端资源使用CDN加速,资源的读取和更新该怎么处理

  • 像CSS、JS、img以及静态HTML等资源文件,如果需要放到CDN服务器上

  • 这些资源的路径就不能写死IP,只能写域名

  • CDN缓存如何通过域名来获取到相应的资源文件?

  • 资源的更新机制又该如何设计?

阅读 7.9k
1 个回答

我说一个简单的CDN实现方式,BIND(DNS)的viewvarnish(具有反向代理功能的缓存应用) 实现的CDN缓存。
当 Client 发起对 www.test.com 的DNS解析的时候。www.test.comDNS服务器可以通过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

给你一张varnishstate engine图。

clipboard.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进