是的,并不是标题党,在我多次测试后,CDN云减速并不是一个玩笑。只有在合适的时候,CDN才真的能为你的网站加速。

一、什么时候不该使用CDN

总的来说,当网站每天的访问者很少的时候,用CDN并不适合。“很少”这个词的意思是,如果访问者ip全国分布广,几乎都是新访问者的时候。

img1

img2

这是我的Google Analytics过去七天访问量统计分析图。从图中可以看见,我网站的访问者基本都是新访问者,从地区上来看,每个地区也就10来个访问者,而且每个访问者访问的网页数量为2到4个,这种情况是不适合用CDN,如果源服务器的延迟很高就更不适合用CDN了。

二、为什么不适合用CDN

首先来看看CDN原理,以腾讯CDN为例。当使用腾讯CDN的时候,访问者访问网站会出现三种情况。

  1. CDN节点没有要访问的页面,需要回源,腾讯会在返回中的header给出:x-cache-lookup: Hit From Upstream

  2. CDN有要访问的页面,在磁盘中,返回的header为:x-cache-lookup: Hit From Disktank Gz

  3. 2一样,CDN有要访问的页面,在Memcache中,返回的header为:x-cache-lookup: Hit From MemCache Gz

其中23从本文的角度来看是相同的。

我用dia画了几张图,因为现在https已经是标配,所以浏览器到CDN设定为https+http2

首先是CDN开启https,回源为http的情况:

https-http

其原理如下:

https-http-info

图中的时间线从上往下:

  1. 第一次访问/,浏览器到CDN需要tcp三次握手和ssl四次握手,CDN发现没有目标资源,所以用http回源,到源服务器需要tcp三次握手然后下载资源,接着把下载的资源存储在CDN磁盘上,最后返回给浏览器。

  2. 第二次访问/movie.html,因为是同域名,浏览器又有DNS缓存,所以浏览器会访问同一个目标IP。由于1的操作,浏览器会缓存ssl域名证书和维持http2的连接,所以浏览器访问此页面不需再握手。但是由于CDN依然没有资源,还是得回源拿目标资源。

  3. 第三次访问/movie.html,由于2的操作,CDN缓存了资源,所以此时可以直接访问给浏览器了。

  4. 第四次访问/movie.html,和3相同,但由于腾讯CDN的特性,第一次访问回源,第二次访问从磁盘拿目标资源,第三次直接从Memcache中拿目标资源返回。

  5. 过了一段时间后,浏览器本地存储的ssl证书缓存过期,http2维持的链接也过期了。再次访问/movie.html,需要重新tcpssl握手。但是由于腾讯CDN中的目标资源还没过期,所以不需要再回源,直接返回数据。从测试来看,已经不在Memcache中,而是回到磁盘中拿数据。

再看看CDN开启https,回源也是https的情况:

https-https

细节如下:

https-https-info

步骤和上面相同,只是现在浏览器到CDN和CDN到源服务器都有ssl握手。

从上面的过程可以看出,如果访问者都是不同地区的新访问者,由于资源都没有在当地CDN节点缓存,会导致回源,从而第一次访问网站用CDN会比不用CDN更慢。有很多人没有备案,服务器不能在国内,所以使用洛杉矶CN2做服务器,或者其他国外服务器。这样由于延迟高,如果回源是https的话,访问非常耗时,可能单单两个ssl握手耗时就需要1秒钟以上,这就是为什么很多人会吐槽一些CDN是云减速的原因了。

三、大部分情况还是应该使用CDN

当然,CDN在其他情况是很有好处的,即使访问访问者少,如果回源够快的话依然适合用CDN。例如我现在的网站,源服务器用的是阿里云的共享虚拟主机,全国30毫秒左右的延迟,使用http回源,这样ssl握手时间也省了。而且因为虚拟主机有最大150个并发连接限制,所以CDN帮我分摊了同一地区的所有并发量。如果网站访问量大的话,或者同一地区的用户很多时,使用CDN对用户体验是有利的,这种情况缓存命中率高,命中了缓存可以让1MB的页面1秒以内打开。

如果还需要考虑搜索引擎蜘蛛回源问题,很多人会选择https回源。我没有选这种方式,我依然使用http回源,但使用DNS解析把搜索引擎蜘蛛解析到一台国外的独立IP服务器上。这样我既保证了访问者访问网站会很快,搜索引擎蜘蛛也可以去爬独立IP的https服务器了。

img3

以上就是我网站目前的架构。