【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深刻研究和实践

提示:阅读本文需提早了解的相关知识css

一、阿里云(https://www.aliyun.comhtml

二、阿里云CDN(https://www.aliyun.com/product/cdn前端

三、阿里云OSS(https://www.aliyun.com/product/ossweb

四、HTTPS(http://baike.baidu.com/view/14121.htm面试

阅读目录结构数据库

引:bootstrap

1、准备工做api

2、总体功能结构跨域

3、具体实现步骤浏览器

4、关键点和问题处理

5、延伸与扩展

6、总结与思考


引:

在平常的开发过程当中,会愈来愈多的使用诸如Bootstrap等前端框架,又或是 JQuery Form这样的第三方JS插件,这些框架和插件中的CSS、JS、字体文件的大小相较于纯粹的页面HTML代码的大小,那是要远远超出。拿Bootstrap举例,连JQuery一块儿,核心文件压缩后大小超过500K,即便GZIP传输,也超过150K,而页面中HTML代码,GZIP后应该至多就5-10K,因而可知,将资源文件剥离出Web服务器,使用CDN加速方式进行访问,不只极大的减轻了服务器带宽的经济压力,也5倍以上提高了单节点Web服务器的页面浏览承载能力,更重要的是,使用CDN也产生了相似多线网络的效果,用户端的体验更佳。

因此愈来愈多的开发团队和公司,已经习惯于使用公共CDN服务,来对核心库进行加速,例如百度静态资源公共库,又例如360网站卫士经常使用前端公共库CDN服务,但CDN服务的美妙又不只于此

因此如何建设本身的CDN加速库并充分挖掘其应用价值,这就是今天要讨论的重点

前人种树后人乘凉,若是从底层开始建设并购买各地节点服务器,未免愚蠢,以第三方云平台服务为基础,充分利用其业务功能、管理菜单、API接口、实践经验等,来构建本身的私有CDN服务才是上策,既然涉及到第三方云平台,那就开始了漫长的试用过程,在过去的一年内,分别试用过包括腾讯云CDN、七牛云CDN、阿里云CDN、微软云CDN等好多CDN服务,比较客观的结论是:虽然阿里云在节点数量、质量等核心指标上并不必定是最佳(CDN加速技术和服务质量评估不在本文讨论范围内),但就开发人员的开发体验与运维人员的管理体验来讲,阿里云是最佳的。

正所谓,阿里云在模仿并赶超AWS的道路上,愈来愈6

那么咱们就使用阿里云的相关服务,来建设本身的CDN加速应用,所要实现的功能用一句话来归纳就是

借助阿里云的OSS和CDN服务,来构建私有CDN加速库,为Web开发提供核心库加速访问支撑,并进一步深刻挖掘CDN加速功能在图片存储访问等其余开发场景中的应用

如下是具体实现步骤

1、准备工做

一、阿里云认证帐号一个(记得充100块)

二、准备域名1个并完成在阿里云的备案(这里购买了alphams.cn域名)

三、对准备的域名申请SSL证书(这里选择从RapidSSL颁发【推荐一个淘宝的证书卖家,店铺名称:琥珀主机,不只价格公道,店主对SSL的相关技术知识也很是专业,本次实践中阿里云有个公钥私钥坑多亏了这位店主的指导】)

四、从模板网站购买收费模板一套(这里买的是比较常见的Unify Responsive Template

2、总体功能结构

应用结构以下图所示

image_thumb[6]

3、具体实现步骤

一、将域名alphams.cn的解析绑定到阿里云云解析上

注:阿里云有个一年88元的VIP解析套餐,性价比较高

image

绑定后以下:

image

二、开通阿里云OSS并添加一个Bucket,叫amscdn

image

注:这里选择了所属区域为华东2,由于博主的ECS服务器购买在华东2,具体能够根据实际状况来选择

添加结果以下:

image

image

这里的OSS外网域名:amscdn.oss-cn-shanghai.aliyuncs.com,即待会要添加的CDN服务的回源地址(若是OSS绑定了域名,也可使用域名做为回源地址)

注:按照阿里云的说法,使用OSS做为CDN的回源,流量费更低

三、对刚开通的OSSBucket节点amscdn进行域名绑定

虽然amscdn这样一个OSS节点是用于内部访问,可是为了装个逼,也给绑定一下域名,阿里提供了快速菜单入口

image

这里选择了使用cdnoss.alphams.cn做为绑定域名

image

刚才也说了,阿里云的综合服务是不错的,在这里的体验就体现优点了,可以自动给域名添加相关解析(不知道其余云服务如今有这样的服务没,至少去年其余平台没有见到或者不全)

image

绑定后以下:

image

这里有个CDN缓存刷新,我没有太搞明白,由于对于CDN服务来讲,这里的OSS只是一个源,与最终使用这个源的CDN并没有直接技术关联关系,阿里云的这个操做,若是有人知道是什么意思,麻烦告知一下。

四、开通阿里云CDN并添加一个加速域名

这里使用cdn.alphams.cn做为加速域名

image

业务类型选择“图片小文件加速”

源站类型就OSS域名,地址是刚才已经添加的OSS节点amscdn的外网地址(注:内网地址是否更快或者是否有效未知,按照技术上的理解,CDN的源站即便在阿里云内网也起不到加速做用,由于是全国分布读取的)

image

添加完成,下面进行配置

image

这里只配置了GZIP智能压缩,其他的配置不是特别熟悉和了解,如需配置建议深刻了解事后再行设置

HTTPS安全加速在下一段中会单独来讲

这时候进入阿里云的域名解析菜单中的CDN加速选项

image

能够看到有一个一键配置CNAME的按钮,点击后就会自动增长相关的CNAME解析

image

五、测试是否成功

到这里就完成了基本的配置,下面试一试是否成功,进入OSS的管理菜单

image

先到OSS节点amscdn中上传一个CSS文件MicrosoftYaHeiFix.css

image

上传成功后获得OSS的访问地址:http://amscdn.oss-cn-shanghai.aliyuncs.com/MicrosoftYaHeiFix.css ,在浏览器访问成功

再试一下OSS域名的访问效果:http://cdnoss.alphams.cn/MicrosoftYaHeiFix.css,浏览器访问也成功

最后试一下CDN回源是否成功:http://cdn.alphams.cn/MicrosoftYaHeiFix.css,浏览器访问也成功

六、继续添加HTTPS访问支持

HTTPS的潮流已经不可逆转,在这里咱们也装个逼,添加对HTTPS的支持,不得不说,在这些细节方面,阿里云仍是蛮不错的(好比微软云中国,在6月以前就只能经过后台客服手动添加证书去支持HTTPS)

点击刚才的HTTPS安全加速,按照以下进行配置,这里的证书内容和私钥,能够问SSL证书发行商要(这里有个大坑,后面会说到)

image

配置好之后显示已经启用了HTTPS安全加速

image

试一下是否成功:https://cdn.alphams.cn/MicrosoftYaHeiFix.css,浏览器访问也成功

查看一下证书

image

七、放入博客园代码中查看效果

刚才的代码是对页面中全部字体都统一为微软雅黑,在博客园的设置中加入以下一段

image

保存后刷新博客页面,能够看到确实都变成了微软雅黑

image

八、经过OSS管理工具资源文件进行管理

以上是整个配置和调试过程,下面才进入正题,在平常的开发和网站运维中,有以下场景是可使用CDN进行加速的

一、购买的第三方前端商业框架或者公司自有封装好的前端框架。此类场景中,框架核心文件基本不会有大的修改,能够稳定的运行于CDN上

二、经常使用JS插件。文件处理、分页、表格处理等经常使用JQuery插件或者Bootstrap插件,能够稳定的运行于CDN上

三、固定的媒体文件。网站Logo、广告位图片、Banner图片等,能够稳定的运行于CDN上

既然有这么多文件须要进行加速,那么有序、便捷的管理就特别重要,因为所实践的项目并非很大,所以采用以下两种管理方式

①使用阿里云官方提供的OSS客户端工具进行源文件管理

②使用阿里云网站在线CDN刷新功能进行平常CDN资源的刷新

首先去阿里云云市场购买价格为0元的OSS客户端工具,地址是:https://market.aliyun.com/products/53690006/cmgj000281.html?spm=5176.730005.203.4.sNXFiY

而后在ECS服务器上安装软件并使用阿里云Access Key ID和Access Key Secret登陆,这里选择的就是刚才的华东2区域(上海)

image

注:为了提升上传速度(内网上行带宽可达到100M以上),这里咱们已经有了和OSS在同一个内网区域的ECS服务器,若是没有也不要紧,就在本地电脑使用就好了

软件会要求设置一个6位快捷数字密码

image

软进去后能够看到,刚才添加MicrosoftYaHeiFix.css文件已经在里面了

image

咱们分别新建两个文件夹,叫Template和Library,分别用于存储固定模板和第三方JS插件,拿出准备好的Unify模板,最新版本号是1.9.4,因此文件目录这样建

image

将Template目录上传

image

上传完毕,选择一个文件测试一下 https://cdn.alphams.cn/Template/Unify/1.9.4/assets/css/app.css, 访问成功

再试一下在Web开发中的效果,选取一个模板中页面

官方的页面地址是:http://htmlstream.com/preview/unify-v1.9.4/page_misc_blank.html 

image

这个页面采用的是本地资源文件存储方式,如今咱们新建一个页面,CDNTest.html,复制彻底同样的HTML代码,只是将全部资源文件都替换为已经生效的CDN地址

image

把这个页面放到一个临时的域名(http://cdntest.alphams.cn/CDNTest.html)下进行访问,访问成功!

image

至此,对模板库CDN加速的配置,算是成功了

九、对博客园加入对Windows Live Writer代码高亮插件wlwsyntaxhighlighter的支持

上一段中,添加了一个Template模板库,下面再试试添加一个插件,正好须要在博客园写博客是须要代码高亮的,就拿这个作实验吧

在Windows Live Writer中,使用的插件是wlwsyntaxhighlighter,而对其提供支撑的就是SyntaxHighlighter库。

wlwsyntaxhighlighter在官网介绍中的使用方法为:

image

那么咱们先将插件上传到OSS中

image

测试地址:https://cdn.alphams.cn/Library/SyntaxHighlighter/3.0.83/styles/shCore.css,能够访问

而后将以下代码添加到博客园我的设置中

 image

保存, 而后在Windows Live Writer中添加一段代码,看看效果如何

image

。。。。。。。。。。。。。。。

哈哈,不行了,我编不下去了,这一段实际上是骗人的,wlwsyntaxhighlighter的版本太老了,我下载的是SyntaxHighlighter库的最新版本,因此根本无法达到效果,这里只是告诉你们一个学习和工做思路,如何充分发挥想象,利用已经搭建好的CDN服务为本身服务。

我本身用的Windows Live Writer插件是PreCode Snippet,不过也并不是彻底瞎写,拿wlwsyntaxhighlighter举例是由于它在Windows Live Writer里面是所见即所得编辑模式的,可在编辑时进行修改。因此若是有谁有更好的相关插件也能够给我推荐一下,微软把插件下载都下架了,Open Live Writer还不成熟,也只能将就用了。。

已经完成了吗?别着急,还有点额外的细节值得关注

4、关键点和问题处理

在整个方案的实践过程当中,也走过弯路遇到过一些问题,主要有以下几个

一、不一样浏览器对字体文件的识别

不一样厂家的CDN服务彷佛对于HTTP头的处理不太同样,而HTTP头的处理又会影响浏览器对资源文件的识别和加载,虽然其中原理我并不专业,但例如谷歌浏览器的最新版本或者手机上的Chromium内核的浏览器对某些前端框架中的字体文件的加载就有怪癖,须要设置服务器的某些跨域属性(腾讯云CDN刚上线时,因为没法设置HTTP头,就没法解决这个问题,如今不知道解决没),虽说不出详细的门道来,不过通过搜索,也找到了解决办法,例如

image

在阿里云里面的对应解决办法就是来到CDN管理菜单中

image

添加HTTP头,参数为access-control-allow-origin,取值为*

image

这样就解决了问题

二、SSL证书密钥的处理

证书这玩意还真是复杂,彻底日不懂,以前在进行支付宝退款开发时就头疼过一次,而阿里云官方提供的帮助只能找到以下:

证书格式说明

各大证书公司颁发的证书格式又有微小的差异,在本次实践中,我先是花了2个多小时研究证书的公钥和私钥,而后又花了1个小时转化格式,都没能成功,最后求助于淘宝证书卖家,1分钟就给我转化好了适合阿里云的格式。。这也是无语了,因此在这里劝你们,术业有专攻,若是弄不懂,及时求助,若是有时间,那就对整个证书体系的全部技术知识都了解一遍,也是不错的,若是有好心人,能够写一篇文章专门讲解一下

三、阿里云OSS对HTTPS的支持

在实践的过程当中发现,阿里云OSS没法内置直接支持HTTPS的访问方式,而官方的回答以下:

image_thumb[2]

从技术本质来讲,CDN是没法彻底替代OSS服务的,对象存储服务虽然是单服务器,可是在例如企业网盘、下载站等场景中,依然有很大的应用空间,因此OSS的HTTPS支持也颇有必要,在这里一方面但愿阿里云可以早日加入配置式的OSS的HTTPS支持,另外一方面,对于反向代理的实现,往后有空,也好好研究一下

四、相对路径绝对路径问题

在实践过程当中,有遇到须要对购买的商业模板进行改造的需求,例如引用图片地址、字符串资源等,而改造过程当中,势必遇到须要对JS或者CSS文件内的相关图片应用路径。这里须要特别留意的是,在JS和CSS中

在CSS中出现的相对路径,是以CSS文件所在路径为基准的,而JS中的路径则是以导入此JS的网页文件所在的位置为基准的

这一点你们须要特别留意

五、阿里云路径长度问题

在实践中,也遇到了有的商业模板,目录层次特别长,在上传OSS的时候,就没法上传,应该是阿里云对最大路径长度作了限制,在这里建议不要超过5级。

结束了吗,还有没,重构是好习惯,想好之后会有怎样的扩展也很重要

下面就谈一谈这样CDN功能,还有能哪些功能和应用上的扩展

5、延伸与扩展

以上所述解决方案,在开发规模20人月之内的软件外包项目以及互联网敏捷项目中,有过屡次很是稳定的实践,但这不是终点,若是深刻下去,还有更多可深刻挖掘的地方

一、权限控制

既然是架设自有的CDN加速服务,那就要求相关资源不可以给其余系统或者不但愿给到的用户访问,针对这个需求,阿里云提供了两种解决方案

image

①防盗链。防盗链的原理很简单,经过判断HTTP头中的Refer地址,从而给出对应的权限应答,对于在本文中对模板和插件资源文件进行CDN加速的场景,防盗链是最简单也最适合的权限控制受权,由于只要设置本身要用的网站的Web地址就能够达到权限控制的效果。

②鉴权。鉴权是阿里云的一个较为复杂的权限体系,具体的讲解在这URL鉴权功能适合于CDN下载或者CDN企业内部文件管理等应用场景,具体的实现方法今天不过多讨论

二、图片上传处理

一般所说的网站资源文件有CSS、JS、IMAGE和FONT,在这里要讨论的是CDN加速对于图片处理的应用,值得注意的是:

阿里云的OSS的图片处理CDN加速机制,对于Web开发中的图片上传存储这一传统问题的解决,真是很是傻瓜和美妙

咱们先回顾一下传统开发中图片存储解决办法,无非如下几种

①在数据库以Blob字段存储图片完整的二进制数据

②将图片保存在服务器上本地目录下,将文件名存入数据库String字段中

③架设单独图片服务器,将图片的完整URL地址存入数据库String字段中

三种方式在不一样规模不一样领域的开发中,都有遇到过,也有稳定的解决方案,但这些都过期了!若是你们留意看的话,各大网站早就开始架设本身图片(头像、相册等)CDN加速服务器

而在这里,咱们也要作一样的事情,让中小开发项目也可以实现图片上传的云存储并进行加速访问

因为这个话题也能够单独成文,在这里只作简要介绍,先看完整的图片上传->存储->展示功能结构

图片加速

针对这个结构,最终的图片呈现3种方式。

①阿里云OSS呈现。最基本的图片云存储,将图片存入阿里云对象存储服务中

②阿里云OSS的CDN加速呈现。对阿里云对象存储服务进行CDN加速,呈现图片仍然是原图

③阿里云OSS的内置图片服务CDN加速呈现。利用阿里云对象存储服务的图片服务,使得呈现的图片可以按照预设的尺寸改变样式和大小

对三种呈现方式咱们分别使用域名

http://image.alphams.cn

https://imagecdn.alphams.cn

https://imageservice.alphams.cn

下面是简要的操做步骤

先建一个图片OSSBucket,命名为amsimage

image

绑定域名image.alphams.cn

image

image

image

继续添加图片CDN

image

配置CNAME

image

添加HTTPS支持

image

image

对刚才添加的amsimage添加图片处理服务

image

image

使用域名imageservice.alphams.cn

image

添加阿里云OSS内置的图片CDN加速服务成功

image

进入CDN管理菜单继续给imageservice的CDN服务添加证书增长HTTPS支持

image

image

下面继续添加3个阿里云OSS图片服务内置的样式

image

而后我写了一个测试的系统,方便你们能看明白(这个后面会单独成文讲解)

https://aliyunimagecdn.alphams.cn/

image

能够看到,一个图片的上传,能够延伸出多种方式与格式的访问,用于不一样的场景。

三、使用阿里云的API进行企业级OSS和CDN管理

前面的功能结构图里面能够看到,针对CDN地址的刷新和OSS数据的上传管理,仍是依赖第三方工具或者阿里云Web管理端,事实上,阿里云已经提供了很是丰富的管理API,利用这些API,能够构建属于企业本身的OSS和CDN管理工具,达到功能与内部管理相结合的效果,更有利于团队协做与绩效管理。这块私有管理工具我有计划去写,可是时间依然不够,若是之后有写好,也会写一篇文章来介绍一下。

至此,整个研究和实践就告一段落了,学会总结是很是重要的

6、总结与思考

虽然在今天写出文章,但整个尝试和实践过程也经历了好几个月,若是说有什么总结和思考,最大的感触就是

云服务已经再也不是所谓的虚拟机或者VPS了,而是真正的深刻到了开发和应用的每个细节和难点,利用云服务已经可以真正的解决问题、提高效率,甚至对软件开发、产品研发、互联网运营起到了某些革命性的突破做用,最近一波特别火的直播APP潮流,我想,和各大云平台提供傻瓜式的直播解决方案是密不可分的,将原来须要独立研发数月之久的直播技术体系,用十几个API就轻松解决,偏偏咱们今天讨论的CDN功能就是直播解决方案中重要的一个环节,这也是对CDN加速服务的应用级深度拓展,因此,在这一波云服务发展浪潮里,在各大厂商还处于波动前行的过程当中,若是可以静下心来,深刻研究和实践相关云服务功能对原有生产力的改造,伴随着云服务厂商的发展而成长,这将是一笔很是宝贵的开发经验和人生历练!

感谢阅读本文,相关文章预告:

以上所探讨的相关技术与解决方案,在不少实践场景中都能用到,后面我将陆续写一些相关文章分享给你们,先预告一篇

《经过阿里云技术对百度UEditor编辑器的.NET版本进行改造,加入CDN图片加速功能》


做者:张柔,发布于  博客园  与  初码博客

转载请注明出处,欢迎邮件交流:zhangrou@printhelloworld.com,或者加QQ群参与讨论:11444444

相关文章
相关标签/搜索