项目开发中静态资源CDN部署详解:原理、优势与注意事项
项目开发中静态资源CDN部署详解:原理、优势与注意事项
在项目开发中,是否应该将静态资源放到CDN服务器上?这是一个值得深入探讨的问题。本文将从静态资源和CDN的基本概念出发,详细分析使用CDN的优缺点,并提供实际应用中的注意事项。
1. 什么是静态资源?
静态资源就是那些静态的资源,不会动的,你看平时那些图片啦,CSS文件啦,Javascript文件啦,一旦部署后,这几乎都是静态的,不会动的。即便下一次修改了代码,再次部署,那个时候也会有新版本的JS CSS文件部署上去,或者带有新的hash值的文件。相信现在已经很少有js文件名一直不变的了吧。不过也难说,比如我刚开始做项目的时候,列表页面的JS就是一直叫list.js,部署多少次也是这个名字,每次跟人家说,就让人家清理缓存,想起来真是有意思。
2. CDN又是什么?
内容分发网络,Content Delivery Network或Content Ddistribute Network,简称CDN,是建立并覆盖在承载网之上,由分布在不同区域的边缘节点服务器群组成的分布式网络。
说的直白点就是,之前做网络的同事,常常听他们口中说,北七家机房怎么怎么样了,廊坊机房怎么怎么样了,很明显带有地域特征。比如你的静态资源被部署在了某个服务器内,但你的网站是要提供给全国人民访问的,那么我们人民那么多,地域那么广,从自己村里去乡里走的路肯定近,去省里走的路肯定远呗,所以你部署在省里的资源,如果可以及时同步到乡里,我们村里发现资源加载就快很多呗。
CDN加速的本质是缓存加速。将服务器上存储的静态内容缓存在CDN节点上,当访问这些静态内容时,无需访问服务器源站,就近访问CDN节点即可获取相同内容,从而达到加速的效果,同时减轻服务器源站的压力。
3. 没有用CDN的时候,这个数据传输大概什么样子?
用户通过浏览器等方式访问网站的过程:
- 用户在自己的浏览器中输入要访问的网站域名。
- 浏览器向本地DNS服务器请求对该域名的解析。
- 本地DNS服务器中如果缓存有这个域名的解析结果,则直接响应用户的解析请求。
- 本地DNS服务器中如果没有关于这个域名的解析结果的缓存,则以递归方式向整个DNS系统请求解析,获得应答后将结果反馈给浏览器。
- 浏览器得到域名解析结果,就是该域名相应的服务设备的IP地址。
- 浏览器向服务器请求内容。
- 服务器将用户请求内容传送给浏览器。
4. 用了CDN,有啥好处?
总的来说,就是网站访问的快多了。
你的网站也更安全了,比如我们重新部署了一些新的JS文件,这个时候如果不启用新的版本资源,用户访问的就还是旧的资源,就的功能,你可以充分测试新上线文件的功能性,安全性后再切换新的静态资源,保证上线的安全。
同时安全上也不止这一点,比如某个地方的机房挂了,比如你们乡里的机房挂了,那么会继续访问县里的,这总比直接访问你部署在省里的源服务器要快得多,而且比如你省里的源服务器挂了,你也可以乡里的,是不是很棒。
5. CDN的工作原理
- 当用户点击网站页面上的内容URL,经过本地DNS系统解析,DNS系统会最终将域名的解析权交给CNAME指向的CDN专用DNS服务器。
- CDN的DNS服务器将CDN的全局负载均衡设备IP地址返回用户。
- 用户向CDN的全局负载均衡设备发起内容URL访问请求。
- CDN全局负载均衡设备根据用户IP地址,以及用户请求的内容URL,选择一台用户所属区域的区域负载均衡设备,告诉用户向这台设备发起请求。
- 区域负载均衡设备会为用户选择一台合适的缓存服务器提供服务,选择的依据包括:根据用户IP地址,判断哪一台服务器距用户最近;根据用户所请求的URL中携带的内容名称,判断哪一台服务器上有用户所需内容;查询各个服务器当前的负载情况,判断哪一台服务器尚有服务能力。基于以上这些条件的综合分析之后,区域负载均衡设备会向全局负载均衡设备返回一台缓存服务器的IP地址。
- 全局负载均衡设备把服务器的IP地址返回给用户。
- 用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。如果这台缓存服务器上并没有用户想要的内容,而区域均衡设备依然将它分配给了用户,那么这台服务器就要向它的上一级缓存服务器请求内容,直至追溯到网站的源服务器将内容拉到本地。
DNS服务器根据用户IP地址,将域名解析成相应节点的缓存服务器IP地址,实现用户就近访问。使用CDN服务的网站,只需将其域名解析权交给CDN的GSLB设备,将需要分发的内容注入CDN,就可以实现内容加速了。
6. 用了CDN,需要注意什么?
用上了CDN,你得注意一些事项,不是说用了就高枕无忧了。
你要选一个业内名声好一些的厂商,别你发现网站出问题了,他们缓存的东西出问题了,你找客服,他们让你提工单,排队解决,那你可有的受了;
比如你上线后,由于还缓存着之前的静态资源,你需要想办法把新的部署的静态资源给切换过来,否则如果你忘记了,然后下班走了,等于没有上线新功能;
由于访问动态内容时,每次都需要访问服务器,由服务器动态生成实时的数据并返回。因此CDN的缓存加速不适用于加速动态内容,CDN无法缓存实时变化的动态内容。对于动态内容请求,CDN节点只能转发回服务器源站,没有加速效果;
得及时续费,有些团队就是,天天嚷嚷着让开发调研这个调研那个,等续费花钱的时候,特别不主动,弄着弄着没钱了,功能用不上了;
缓存更新的时效性,有时候你上线了新的版本,虽然版本号已经切换过来了,但浏览器加载的还是旧文件,这很可能是CDN缓存还未更新,有个时效性,如果不了解这个,开发人员大半夜的上完线,发现没上去,开始各处找问题,一来二去又解决了半天,把大家折腾的不轻,最后发现大家啥也没动,缓存时间一过,是新文件了。