是的,并不是标题党,在我多次测试后,CDN云减速并不是一个玩笑。只有在合适的时候,CDN才真的能为你的网站加速。
一、什么时候不该使用CDN
总的来说,当网站每天的访问者很少的时候,用CDN并不适合。“很少”这个词的意思是,如果访问者ip全国分布广,几乎都是新访问者的时候。
这是我的Google Analytics
过去七天访问量统计分析图。从图中可以看见,我网站的访问者基本都是新访问者,从地区上来看,每个地区也就10来个访问者,而且每个访问者访问的网页数量为2到4个,这种情况是不适合用CDN,如果源服务器的延迟很高就更不适合用CDN了。
二、为什么不适合用CDN
首先来看看CDN原理,以腾讯CDN为例。当使用腾讯CDN的时候,访问者访问网站会出现三种情况。
CDN节点没有要访问的页面,需要回源,腾讯会在返回中的
header
给出:x-cache-lookup: Hit From Upstream
。CDN有要访问的页面,在磁盘中,返回的
header
为:x-cache-lookup: Hit From Disktank Gz
。和
2
一样,CDN有要访问的页面,在Memcache
中,返回的header
为:x-cache-lookup: Hit From MemCache Gz
。
其中2
和3
从本文的角度来看是相同的。
我用dia
画了几张图,因为现在https
已经是标配,所以浏览器到CDN设定为https+http2
。
首先是CDN开启https
,回源为http
的情况:
其原理如下:
图中的时间线从上往下:
第一次访问
/
,浏览器到CDN需要tcp
三次握手和ssl
四次握手,CDN发现没有目标资源,所以用http
回源,到源服务器需要tcp
三次握手然后下载资源,接着把下载的资源存储在CDN磁盘上,最后返回给浏览器。第二次访问
/movie.html
,因为是同域名,浏览器又有DNS
缓存,所以浏览器会访问同一个目标IP。由于1
的操作,浏览器会缓存ssl
域名证书和维持http2
的连接,所以浏览器访问此页面不需再握手。但是由于CDN依然没有资源,还是得回源拿目标资源。第三次访问
/movie.html
,由于2
的操作,CDN缓存了资源,所以此时可以直接访问给浏览器了。第四次访问
/movie.html
,和3
相同,但由于腾讯CDN的特性,第一次访问回源,第二次访问从磁盘拿目标资源,第三次直接从Memcache
中拿目标资源返回。过了一段时间后,浏览器本地存储的
ssl
证书缓存过期,http2
维持的链接也过期了。再次访问/movie.html
,需要重新tcp
和ssl
握手。但是由于腾讯CDN中的目标资源还没过期,所以不需要再回源,直接返回数据。从测试来看,已经不在Memcache
中,而是回到磁盘中拿数据。
再看看CDN开启https
,回源也是https
的情况:
细节如下:
步骤和上面相同,只是现在浏览器到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
服务器了。
以上就是我网站目前的架构。