用云存储和CDN轻松搞定网站图片
文 / 倪浩
“无图无真相,有视频更好”。一般来说,网络用户都喜欢图片和视频,而不喜欢读干巴巴的文字。这看似单纯的意愿,却让网站的开发者和维护人员叫苦不迭——图片、视频等内容占用了一个网站的很多存储、带宽资源。是时候把图片、视频迁移到云存储,来释放被压得喘不过气的服务器和带宽了!
下面以一个网站的图片存储为例,来逐步了解如何使用开放存储服务(Open Storage Service,简称OSS)。
开放存储服务
要使用OSS,需要先在 http://oss.aliyun.com网站上注册,注册成功后,即可在网站上的OSS管理中心创建bucket,上传、下载自己的object。
bucket是用户数据的命名空间,例如图片可以放到一个bucket中,视频放到另外一个bucket中。一个bucket存储的总数据量和文件个数都是无限制的。存储在bucket中的每个文件,称之为object。存储在object中的数据可以是任意内容,OSS不会去处理object中的数据。
对于每个bucket,OSS容许设置三种访问权限,即私有读写(private)、公开读私有写(public-read)、公开读写(public-read-write)。对于私有读写和私有写的权限,OSS使用API密钥对(AccessID/AccessKey)来保证你的数据只能被你自己安全访问,所以千万不要向任何人泄露你的安全加密对。API密钥对可以从OSS的管理中心获取到,如图1所示。
图1 OSS管理中心
初阶:使用命令行工具
对于开发人员来说,使用命令行工具可以更容易地操作OSS。命令行工具随Python SDK包一起发布,从开放存储主页 http://oss.aliyun.com可以下载到。
安装好Python SDK包后(安装指南参考主页的SDK使用向导),首先用osscmd来配置你的安全加密对(以下以Linux环境为例,Windows用户需要用python path_to_osscmd来指定osscmd的路径):
$ osscmd config –id=AccessID –key=AccessKey
配置完即可开始创建一个bucket,使用命令行工具键入如下命令创建一个叫做myimage的bucket,创建完调用osscmd的ls命令来列出已经有的bucket:
$ osscmd createbucket myimage
$ osscmd ls
由于bucket名字是全局唯一的,因此你创建的bucket可能和已存在的bucket冲突。建议使用公司的网址作为前缀来创建bucket,如com-abc-img。默认情况下,osscmd创建的bucket权限是private。对于Web图片访问,可以设置bucket的权限为public-read以将存储在OSS中的图片直接嵌入网页。可以使用osscmd的setacl命令来设置bucket权限为public-read:
$ osscmd setacl myimage –acl=public-read
接下来,上传一个图片到myimage中。为了使浏览器正确解析图片,设置它的类型为图片(image/jpg):
$ osscmd put –content-type=image/jpg /path/to/top.jpg oss://myimage/
这样就成功地将图片文件top.jpg存入到了myimage中。这个文件的URL地址是http://storage.aliyun.com/myimage/top.jpg。对这个URL:域名地址是OSS的服务地址htpp://storage.aliyun.com,myimage是bucket的名字,接下来就是刚刚上传的图片名。可以将这个URL直接嵌入到HTML页面中的img元素中:
<img src=”http://storage.aliyun.com/myimage/top.jpg” alt=”top image”>
这里需要提示的是:在使用osscmd的put命令时加入-p参数,在上传完文件后,会打印出URL。
直接键入osscmd,不加参数即可输出全部支持的命令。
进阶:使用SDK通过程序来操作OSS
OSS提供了Python、PHP、Java、C、C#五种语言的SDK包,如果觉得直接调用OSS的REST API麻烦的话,可以使用官方提供的可靠SDK。
我们选择用时下流行的Python语言来操作OSS。上一节安装完Python SDK后,我们已经不需要更多的配置了。打开文本编辑器或者vim,你用EMACS?佩服你,是个牛人!
下面代码的作用是打印出自己的所有bucket列表:
接下来,用SDK向刚刚创建的myimages中写入网页的导航图片nav.jpg。代码如下:
如果没有报错的话,文件已经上传成功了。可以使用osscmd的ls命令来查看这个文件是否已经存在:
$ osscmd ls oss://myimages/
看到nav.jpg了吗?还可以用osscmd的meta命令来查看nav.jpg的属性:
$ osscmd meta oss://myimages/nav.jpg
输出中的第二列是nav.jpg的etag(即md5值)。回到SDK,接着再用这些代码继续传一些文件,然后用SDK来查看有哪些文件存在。
继续写下面的代码就可以列出myimages中的所有文件:
网站大量的图片,需要使用文件夹的方式来组织。在OSS里如何建立文件夹呢?非常简单,只需要在文件名之前加上文件夹名,OSS会自动为你创建出文件夹。使用osscmd来上传文件到myimages中的2012这个目录,并且用ls命令列出:
$ osscmd put /path/to/sidebar.jpg oss://myimages/2012/
$ osscmd ls oss://myimages/2012/
而使用SDK的代码如下:
用代码列出2012目录下的文件:
高阶:安全签名的URL和自定义header
对于有些设置为private的bucket,有时需要容许其中的某个文件能够被公开访问,但又不希望把bucket的权限设置为public-read而导致其他数据有泄露的危险。对URL进行签名能够有效地解决这个问题。使用osscmd对一个文件进行签名:
$ osscmd signurl oss://myimages/2012/sidebar.jpg –timeout=600
命令最后的timeout参数的含义是生成的链接在600秒内有效,超过600秒就不可访问。使用SDK来生成URL:
对于某些网站,如果要防止盗链(或防止搜索引擎爬虫导致的网站流量飙升),可以使用生成的URL嵌入页面,生成URL的过程不需要和OSS进行交换。
如果想在读取文件时,OSS支持返回一些自定义的响应头(response header),需要在上传这个文件时就设置好。目前,除了前面介绍的Content-Type以外,OSS还支持设置如下几种常用的HTTP响应头:Expires、Cache-Control、Content-Disposition和Content-Encoding。这些Header的具体含义,可以参考RFC 2616标准。使用API来设置这些响应头的方法如下:
经济、无需运维的云存储
以上介绍了OSS的基本功能,与传统的存储如NAS等解决方案相比,OSS更经济,并且为用户彻底解决了繁杂的系统日常运维、备份等工作。
传统存储系统随着业务规模的增长,必须不断地预先扩容,同时还要对存储系统中的数据不断备份,以面对可能突然发生的硬件故障。而使用OSS,用户上传的数据自动会有多份拷贝冗余,数据安全性达到99.99999999%。OSS在维护用户数据高可靠性的同时,也保障了服务的高可用性,承诺最低99.9%的可用性,所有繁杂的存储备份和硬件故障不再是用户的问题。
在网络方面,OSS的网络响应速度非常具有优势,保证了全国绝大多数地区的良好访问体验。
但当用户网站的访问量非常大,需要服务全国各地用户,特别是部分静态图片成为访问热点时,使用CDN服务,能够更快地将数据传递到终端用户,并且网络流量的开销也更为经济。接下来,让我们了解一下阿里云CDN的情况。
使用CDN加速内容加载的速度
阿里云CDN服务是一个遍布全国的分布式缓存系统,能够将网站文件(如图片或JavaScript代码文件)缓存到全国多个城市机房中的服务器上,当一个用户访问你的网站时,会就近到靠近TA的城市的服务器上获取数据,这样最终用户访问你的服务速度会非常快。
阿里云CDN服务在全国部署超过100个节点,能提供给用户优良的网络加速效果。当网站业务突然爆发增长时,无需手忙脚乱地扩容网络带宽,使用CDN服务即可轻松应对。和OSS服务一样,使用CDN,需要先在aliyun.com网站上开通CDN服务。开通后,需要在网站上的管理中心创建你的distribution(即分发频道),每个distribution由两个必须的部分组成:distribution ID和源站地址。
举例来说,需要对刚刚存储在OSS中的myimages这个bucket中的数据进行加速,那么源站地址即为http://storage.aliyun.com,CDN服务会自动为用户创建一个distribution ID,服务创建完成后,即可使用http://distributionID.aliyuncdn.com/myimages/someimage.jpg来访问原来存储在myimage这个bucket中的someimage.jpg文件。如果不想使用阿里云CDN生成的域名,那么可以将自己网站的二级域名,如cdn.abc.com,加入一个CNAME记录到distributionID.aliyuncdn.com。
创建distribution需要在阿里云网站的CDN管理页面操作。而当distribution创建好之后,即可使用SDK来对distribution进行操作,代码非常类似OSS的使用方法,接下来的代码列出了用户的distribution列表,并且将其中一个ID为myID的distribution中的一张图片从CDN缓存中删除。
由此可见,使用阿里云OSS和CDN,可以简单、经济地解决服务的存储和网络问题,毕竟,大多数网站或应用的存储和网络带宽多半是被图片或视频消耗掉的。
从整个业界来看,最近这样的面向个人用户的云存储如国外的DropBox和Box.net非常受欢迎。非常期待大家能在阿里云服务如OSS平台上开发出这么棒的应用!
本文选自《凌云》杂志第1期,更多精彩内容敬请关注《程序员》2012年02期杂志