用云存储和CDN轻松搞定网站图片

时间:2024-02-18 07:54:00

http://www.kuqin.com/web/20120207/317912.html

 

“无图无真相,有视频更好”。一般来说,网络用户都喜欢图片和视频,而不喜欢读干巴巴的文字。这看似单纯的意愿,却让网站的开发者和维护人员叫苦不 迭——图片、视频等内容占用了一个网站的很多存储、带宽资源。是时候把图片、视频迁移到云存储,来释放被压得喘不过气的服务器和带宽了!

下面以一个网站的图片存储为例,来逐步了解如何使用开放存储服务(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平台上开发出这么棒的应用!