CDN
CDN¶
统计信息:字数 7136 阅读15分钟
CDN 定义¶
内容分发网络 content delivery network
概况:设置多个节点服务器,分布在不同区域中,便于用户进行数据传递和访问。当某一个节点出现问题时,通过其他节点仍然可以完成数据传输工作,可以提高用户访问网站的响应速度。
“分布式存储”:将中心平台的内容分发到各地的边缘服务器,使用户能够就近获取所需内容,降低网络用时,提高用户访问响应速度和命中率。利用了索引、缓存等技术。
“负载均衡”:对所有发送的请求进行访问调度,确定提供给用户的最终实际访问地址。
“内容管理”:负责对存储内容的监管、数据分析等。
CDN 优点¶
- 浏览器从服务器上下载 CSS、js 和图片等文件时都要和服务器连接,而大部分服务器的带宽有限,如果超过限制,网页就半天反应不过来。而 CDN 可以通过不同的域名来加载文件,从而使下载文件的并发连接数大大增加。
- jquery 一类的库文件被广泛使用,如果访问你网站的用户的浏览器之前在访问别的网站时通过和你相同的 CDN 已经加载了 jquery,由于该文件已经被缓存了,就不用重新下载了。
- CDN 具有更好的可用性,更低的网络延迟和丢包率。
- CDN 能提供本地的数据中心,这样一来,那些远离你网站主服务器的用户也能就近很快地下载文件。
- 很多商业付费的 CDN 能提供使用报告,这可以作为你自己网站分析报告的补充。
- CDN 能够分配负载,节省带宽,提高你网站的性能,降低网站托管的成本,通常是免费的。
CDN 不足¶
-
在开发阶段如果处在断网环境下,CDN 文件是无法加载的。
-
不够灵活。比如你只使用 jquery 库的一小部分,如果使用 CDN 上提供的文件就没办法进行拆分,还是得下载原来的大小,反而没有自己拆分后加载速度来得快。
-
尽管一些流行的 CDN 文件事先缓存过的几率较大,但并不是一定的,一些移动设备的缓存可能很小而且效率很低,CDN 的优势就不明显了,特别是当你可以在本地服务器上存放比 CDN 文件更小的文件时。
-
由于地理、法律、政策和商业上的阻隔,你所在的地区可能屏蔽了一些流行的免费 CDN 服务的域名或者 IP 地址。
-
CDN 会有出故障的时候,这时候要有备用方案,也就是你的本地文件,这种处于稳定考虑的冗余会增大开发工作量和复杂度。
-
如果安全性对你的网站很重要,就不要使用公共的 CDN,因为当你远程从 CDN 请求文件时,你的访问来源信息也被发送过去,一些远程的 js 文件可能被修改用来搜集你的用户或者系统信息,而当你使用 https 协议时,能选择的 CDN 就更加有限。
传统网站的访问过程¶
-
用户在自己的浏览器中输入要访问的网站域名。
-
浏览器向**本地 DNS 服务器**请求对该域名的解析。
-
本地 DNS 服务器中如果缓存有这个域名的解析结果,则直接响应用户的解析请求。
-
本地 DNS 服务器中如果没有关于这个域名的解析结果的缓存,则以递归方式向整个**DNS 系统**请求解析,获得应答后将结果反馈给浏览器。
-
浏览器得到域名解析结果,就是该域名相应的服务设备的 IP 地址。
-
浏览器向服务器请求内容。
-
服务器将用户请求内容传送给浏览器。
加入 CDN 后的访问过程¶
- 当用户点击网站页面上的内容 URL,经过**本地 DNS 系统**解析,DNS 系统会最终将域名的解析权交给 CNAME 指向的**CDN 专用 DNS 服务器**。
- CDN 的 DNS 服务器将**CDN 的全局负载均衡设备 IP 地址**返回用户。
- 用户向 CDN 的全局负载均衡设备发起内容 URL 访问请求。
- CDN 全局负载均衡设备根据用户 IP 地址,以及用户请求的内容 URL,选择一台**用户所属区域的区域负载均衡设备**,告诉用户向这台设备发起请求。
- 区域负载均衡设备会为用户选择一台**合适的缓存服务器**提供服务,选择的依据包括:根据用户 IP 地址,判断哪一台服务器距用户最近;根据用户所请求的 URL 中携带的内容名称,判断哪一台服务器上有用户所需内容;查询各个服务器当前的负载情况,判断哪一台服务器尚有服务能力。基于以上这些条件的综合分析之后,**区域负载均衡设备**会向**全局负载均衡设备**返回一台缓存服务器的 IP 地址。
- **全局负载均衡设备**把服务器的 IP 地址返回给用户。
- 用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。
前端 CDN 优化网站性能¶
1.前端的文件分为静态文件和动态文件:对于静态文件(img-css-video)占用资源较大,这部分文件基本保持不变,可以使用 CDN 进行加速;对于 JS 文件(jquery)不同网站使用多,可以使用 CDN 进行加速。对于静态 html 界面,如果纯静态界面可以使用 CDN 加速。如果涉及 jsp 动态界面直接从源服务器获取文件比较好。
动态页面:当收到用户请求时服务器会在服务端对页面进行一次后台渲染把数据渲染到页面之后再返回给用户(当然,服务端也可以做缓存)。
动态页面是不适合做 cdn 加速的。原因:参照上面讲的 cdn 工作原理,由于页面是动态的,内容的有效期就比较活跃。假如我们对动态页面做了 cdn 加速,那么场景应该是这样的:用户——>边缘节点(验证有效期发现失效)——>源站。经过这个过程才能拿到页面,这样并没有起到加速的作用反而更慢了,那我们还不如直接去源站拿(当然我们可以要求 cdn 厂商做定制化开发)。
静态页面:收到用户请求时,服务端不做渲染工作直接返回给用户。
2.浏览器对同一 ip 进行请求的最大并发连接数。不同浏览器的并发数量不一样:IE11 、IE10 、chrome、Firefox 的并发连接数是 6 个,IE9 是 10 个。
如果页面静态资源(图片等)过多(大于 6 个)会存在资源请求等待的情况。目前现实状况是大多用户带宽越来越大,但是咱们的静态资源并非那么大,很多文件都是几 k 或者几十 k,6 个文件加起来都小于带宽。这样就导致了资源的浪费。解决方案是:用多个不同 IP 的服务器来存储这些文件,并在页面中通过绝对路径的方式引用(要求同一 IP 的文件不超过 6 个)。这样就可以尽可能的减少资源请求等待的情况。
参考资料¶
https://baike.baidu.com/item/CDN/420951?fr=aladdin https://cloud.tencent.com/document/product/228/3149 https://en.wikipedia.org/wiki/Content_delivery_network https://segmentfault.com/a/1190000007962943 https://blog.csdn.net/u010400084/article/details/52925597