公司网站和社区使用网宿CDN WEB加速服务已经有半年了,启用CDN后,网站的管理方式需要有所改变,CDN的配置也需要不断调整,这样才能真正发挥出CDN的作用。特在此分享本人感触比较深的几点。
首先来看看CDN的工作原理。访问者访问使用CDN服务的网站时,DNS域名服务器通过CNAME方式将最终域名请求重定向当时能够最快响应用户的CDN节点地址上,CDN节点根据访问者提交的信息查看是否有缓存,如果有则直接返回结果,如果没有找到缓存,则协调其它节点从源服务器获取结果。
从其原理可以看出,CDN在启着两个特点:
一是分步式的节点,起到负载均衡、协调跨运营商跨地域访问的作用;二是节点上的缓存,这无疑可以减少源服务器的负载,节省带宽。
正是由于CDN如上两个特点,也给网站的管理人员带来了不少麻烦:
1. 静态文件版本管理
CDN的缓存是用户一般不可控的,且静态资源(如:js、css、图片等)的缓存时间非常长,虽然CDN提供商一般都会提供刷新缓存的方法,这种方法在少量更新时可以接受,但如果更新文件过多(如一次升级),则会非常麻烦。可以使用“
静态资源(JS、CSS、图片)版本控制”说的,对静态资源进行管理,这样每次升级时即省事又省心。
2. 启用HTTP压缩
HTTP压缩是网页优化几大方法中见效最大的一个,启用CDN后,HTTP压缩的配置会比较麻烦。在做完成通常的启用压缩方法后,还要
启用压缩对HTTP1.0、代理的支持,在IIS下配置如下:
cscript adsutil.vbs set W3SVC/Filters/Compression/Parameters/HcNoCompressionForHttp10 false
cscript adsutil.vbs set W3SVC/Filters/Compression/Parameters/HcNoCompressionForProxies false
做完上述配置后,通知CDN提供商,开通HTTP压缩功能即可。
而我用的网宿CDN还有其特殊要求,他要求
在响应里增加一个HTTP Header:
Vary: Accept-Encoding 。只有有这个头部的文件,才会接受压缩。这个Header可以简单地在IIS的站点属性里添加。
3. 获取客户端真实IP
由于访客不是直接访问源服务器,跟源服务打交道的都是CDN的节点机器,所以在源服务器抓取到的IP都是节点IP。这对按ip来统计的浏览量、网站统计等模块的影响会比较大。一般来说,CDN节点会以某种方式将源客户端的IP传递给源服务器,就拿我用的网宿CDN来说,它是将源IP添加到了一个叫“Cdn-Src-Ip”的Http Header里,以C#语言为例,获得客户端真实IP的方式如下:
String srcIp = Request.Headers["Cdn-Src-Ip"];
if(srcIp == null) {
srcIp = Request.UserHostAddress;
}
以上内容,根据不同的CDN提供商可能会有所不同,操作前最好咨询自己的CDN提供商。
附:
什么是CDN?
CDN的全称是Content Delivery Network,即内容分发网络。是通过在现有的 Internet 中增加一层新的网络架构,将网站的内容发布到最接近用户的网络 " 边缘 " ,使用户可以就近取得所需的内容,解决 Internet 网络拥塞状况,提高用户访问网站的响应速度。从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等原因,造成的用户访问网站的响应速度慢的问题。
通过用户就近性和服务器负载的判断, CDN 确保内容以一种极为高效的方式为用户的请求提供服务。总的来讲,内容服务基于缓存服务器,也称作代理缓存 (Surrogate) ,它位于网络的边缘,距用户仅有 “ 一跳 ”(Single Hop) 之遥。
同时,代理缓存是内容提供商源服务器的一个透明镜像。这样的架构使得 CDN 服务提供商能够代表他们客户,即内容供应商,向最终用户提供尽可能好的体验。采用 CDN 技术,能处理整个网站页面的 70% ~ 95 %的内容访问量,减轻服务器的压力,提升了网站的性能和可扩展性。
而CDN又有别于一般的镜像,因为它比镜像更智能,或者可以做这样一个比喻:CDN=更智能的镜像+缓存+流量导流。因而,CDN可以明显提高Internet网络中信息流动的效率。
总的来说,CDN是一个经策略性部署的整体系统,能够帮助用户解决分布式存储、负载均衡、网络请求的重定向和内容管理等问题;CDN代表了一种基于质量与秩序的网络服务模式。
为什么要用CDN?
通过提高网站响应速度,改善用户体验,增强用户满意度和粘合度;
轻松应对突发流量,随时展开网络推广;
有效抵御洪水式网络攻击,使网站永不宕机;
减少源站点负载,节省网站分布式架构的支出成本和运维成本。