首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > 高性能WEB开发 >

——图片服务器的搭建

2013-09-11 
求助——图片服务器的搭建大家有什么比较好的方案,搭建图片服务器,能够将图片文件从web服务器上分离出来,单

求助——图片服务器的搭建
大家有什么比较好的方案,搭建图片服务器,能够将图片文件从web服务器上分离出来,单独存储一个或多个服务器上

看到别人ftp异步传送的方案,就是将原本服务器上的图片转移到另个服务器,然后图片使用二级域名,访问另一个服务器;

这个方案有几个缺陷
1 图片文件被写入两次
2 图片的访问权限控制,以及删除会比较麻烦
3 实时性不好

优点:
1 基本不需要做什么,配置一下ftp就可以
2 对于原web项目基本透明,不需要改什么
3 实现简单

但是我现在的需求是
1 图片服务器上的图片也能够控制访问,比如用户访问权限等
2 图片能够删除
3 实时性好
4 对原有web项目透明
5 拓展性好
6 效率高

从图片服务器角度有两种方案可以考虑;
应用动态服务器技术比如说jsp php 
纯静态技术

困难主要在于要考虑到有访问权限的控制,我想可能要用动态web技术,有一点点思路,但是心里总是隐隐的觉得这样有点不妥;
判断访问权限,则要判断请求用户,则要记录登陆状态,用户信息,得到session;如果图片服务器和web服务器能够session共享那样是好的,但是如果一个是java项目一个是php项目....这样的话拓展性恐怕会成问题,耦合太多;

http://zhidao.baidu.com/link?url=cyRnhmg6meZjfkiGpW4ZyXVrWXTvIhFp8_vpVVYqDHxwai73Ce60ATbqWK_IoGfq-87HDZutTa41OKXcsDUb6q
可行性好像是有的,但是怕自己走了歪路


这方面自己是第一次做,没有什么经验,所以想听听大家,有没有成熟的方案;因为图片服务器也不是什么新技术新概念;


自己也去找了一些资料,但是找到的都是人家的方案,需求和我不一样
比如说这个http://blog.csdn.net/iinel/article/details/4669448
淘宝的图片都是给客户看的,好像没有私有的图片,如果是这样确实是可以的一个lighttpd就可以搞定
又比如这个,就是前文所提ftp方案的http://houxiyang.com/archives/23/
还有更多的
http://blog.sina.com.cn/s/blog_5611597901014o8m.html
http://www.alongsky.com/?p=811
http://cnodejs.org/topic/4f7b17c38a04d82a3d763dab
http://www.ablanxue.com/prone_10800_1.html

经过试验,人人网,没有对图片的访问权限做控制,即便图片是私密相册中的,只要你有图片的链接地址;
但是百度做了,不过是用连接有效时间做的,超过了有效时间提示没有权限,不错的方式;在有效时间内不同的浏览器(没有登陆限制,注销登陆,清除浏览器cookie)都可以访问;
下面这个已经过期了(不明白的是,有效时间是编码写在url里还是服务器session过期,有兴趣的朋友可以实验一下,假设是服务器session过期的话,你用chrome浏览器登陆后然后进入非私密相册,复制一个图片地址,不断操作,然后用另一个款浏览器访问复制的链接,假设通过chrome的不断访问可以延长在另一个浏览器中的访问的时间限制,那么应该就是这个方案了,如果不是这样的,那么是一个固定的时间,我想要么固定时间写在url里要么存在服务器上)
http://b.hiphotos.bdimg.com/album/s%3D740%3Bq%3D90/sign=e8ba7d98b31bb0518b24b12c0641ab89/2e2eb9389b504fc294afc1bfe5dde71191ef6d93.jpg
连接地址是动态的,其中包含一个令牌,每次都不一样sign后的,估计是sessionID什么的
http://h.hiphotos.bdimg.com/album/s%3D1100%3Bq%3D90/sign=5e8e7770828ba61edbeecc2e7104ac7b/09fa513d269759eed2d61171b2fb43166c22df82.jpg
http://h.hiphotos.bdimg.com/album/s%3D740%3Bq%3D90/sign=78b174c4251f95caa2f590b2f92c0e03/09fa513d269759eed2d61171b2fb43166c22df82.jpg
上面两个是同一张图片
如果把相册改成私有的,那么上面图片的连接地址就变成了
http://priv.hiphotos.baidu.com/album/s%3D1100%3Bq%3D90/sign=5e8e7770828ba61edbeecc2e7104ac7b/09fa513d269759eed2d61171b2fb43166c22df82.jpg?psign=f08badaeb899a9017d4189071dbcc51a02087bf408d1d5e0

这样换个浏览器就不能访问了(有登陆验证cookies或者在图片服务器上注册了session)
换了个域名,估计是不同的虚拟服务器了,这个服务器有访问权限验证;但我想,图片应该还是在相同的物理服务器上(百度个人空间的个人相册不是公共的应用,没有大量的并发访问,没有必要存储多份做分布式),只是入口不一样了,猜测;因为,将图片设置为私密,之前在非私密状态下保存的相同图片的URL在过期前依然可用;

百度技术比人人好呀;不知道他们怎么做的,不过因该是使用了不同的方案对待私密图片和非私密图片;

要是能够做成像百度这样就足够好了,虽然不知道百度怎么做的,但是可以大概猜测一下:
非私密相册
1 图片服务器上以这个域名h.hiphotos.bdimg.com作为虚拟服务器的入口
2 图片服务器和百度空间服务器共享session 使用squid等等共享session的方法;
3 虚拟服务器h.hiphotos.bdimg.com 接受到访问请求时,通过路由(php)或者过滤器(jsp)来提取url中的令牌,可能是sessionID,或者是编码后的,然后查找是否存在此session;存在则返回图片;不存在则返回统一的错误图片“您访问的图片是私有的”



私密相册
1 图片服务器上以这个域名priv.hiphotos.baidu.com作为虚拟服务器的入口
2 图片服务器和百度空间服务器共享session 使用squid等等共享session的方法
3 虚拟服务器priv.hiphotos.baidu.com 接受到访问请求时,检查浏览器发送过来的请求信息中的cookie是否包含sessionID;存在且正确则返回图片;不存在则或错误返回统一的错误图片“您访问的图片是私有的”


大家支支招
10号就要给出解决方案了 服务器 图片服务器
[解决办法]
需要安全认证就比较烦人,主要是性能很难上的去。

通用做法的话:单点登录,但是单点登录会涉及到身份确认的开销。

性能优先做法的话:考虑设置 资源密码(每个资源单独一个密码,在资源创建时随机生成) URL参数中生成  随机数+时间戳+资源ID 等的组合,用资源密码加密。另外,时间戳其实不一定真的代表时间,有时候是个时效性动态密码(用过动态口令密保么?)。


[解决办法]
谈不上指点,只是探讨。

所谓性能优先,其实也只不过节省了身份认证所需开销,但却增加了URL生成开销,所以还要实际测试下。

思路其实很简单:
◎ 首先,为了资源安全,服务器端必须掌握某个“信息”,而这个信息是绝对不需要(也不能)暴露给最终用户的,因此这个信息不能是 资源ID、URL、名称 之类的东西,只能是系统生成的一个随机码;
◎ 其次,这个随机码,如果是全系统只有一个,被猜解的可能性就会大大提升,因此最好是每资源一个,所以变成“资源密码”;
◎ 而后,这个信息是一种标识,意味着持有该信息的人,就拥有访问特定资源的资格,因此这个信息最终需要被体现到URL中;
◎ 最后,要进入URL的,就得避免其容易被猜解,所以需要增加随机数、时间戳等动态内容以防止被拆解,信息本身则可以作为一个密钥来对待。

缺点:
1、生成URL的开销需要权衡,高复杂度加密严重损害CPU,低复杂度加密损害安全性;
2、生成的URL存在时效性,如果用户看页面看了很久才点超链接,可能这个超链接已经失效了(替代方案是点击时才进行生成,但又降低了响应时间);
3、仍然有被猜解可能。

热点排行