先简单介绍一下 CDN
CDN 的概念比较简单,将源站内容分发至最接近用户的节点,使用户可就近取得所需内容,提高用户访问的响应速度和成功率。可以简单的理解为京东的物流仓储,如果你在京东上买自营产品,它会根据收获地点,使用在全国范围内离我们最近、送达最快的仓库,因此我们的收获时间会大大减少。
所以,使用 CDN 最重要的益处即是:加速网站的访问。
此外,还一个非常明显的优点:它能减轻源站的负载,扛住 DDOS 攻击(请求到了 CDN 服务器)。
CDN 的访问原理可以简单的理解为:DNS 将域名解析的权利交给了 CDN(也就是我们平常在阿里云,腾讯云设置的 CNAME),然后 CDN 会返回一个最快节点的 IP,让我们向这个 IP 发出请求。
至于架设原理,不在本文的讨论范围内,也就不说了(其实我也不知道)。
接下来,来看看我遇到的两个问题。
CDN 域名与主站域名不相同的原因
如果你打开我的 BLOG 你会发现我使用的 CDN 是二级域名,即是 https://cdn.jkchao.cn ;
还有一些 CDN 的域名与主域名相同。
两种方式应该都是不正确的。
如果你有意留意到如天猫,京东等网站的静态资源域名,你会发现与主域名不相同。
如天猫上,主站是 https://www.tmall.com , JavaScript 文件: https://g.alicdn.com/xxx
如果主域名与 CDN 域名相同,你需要对不同类型的文件设置不同的 cache 规则,比如说网站的 logo,设置十年,某些 JavaScript 文件设置时间为一年。但是这样就不利于 CDN 的最大优势了。如果将静态元素抽取出来,就可以很方便的对所有静态元素部署规则,而不用考虑动态请求。减少规则的条数可以提升 cdn 的效率。
除此之外,由于 CDN 与网站的域名相同,在请求时会带上无用 cookie(如果有),会浪费带宽。
如果 CDN 域名使用的是二级域名方式,该问题点在于,请求静态资源也会带上 cookie:


因为在通常境况下,写 cookie 的时候,会写在根域下(如:ccc.com),因此其子域(a.ccc.con、cdn.ccc.com)都会带上 cookie。
CDN 节点问题
最近遇到一个问题,问题简单描述如下:不同地方的用户要访问你的同一个 html,但是内容部分(js)不同,怎么实现?
我当时给出最直接的答案是:Nodejs 判断来源,渲染不同的 JavaScript(页面已经是服务端渲染)。
此外有人给出利用 CDN 节点,如果我没理解错,实现的方式是 html 中请求的静态文件的域名是相同的,然后解析成 IP,请求 CDN 服务器时,返回的文件不同。但是具体要怎么实现,好像并不是一件容易的事(在网站找了一圈,没找到解决方式)。
挖坑,待解决....