图片存储
把图片存储到什么介质上? 如果有足够的资金购买专用的图片服务器硬件或者 NAS(网络连接式存储)设备,那么简单的很;如果有能力自己开发单独存储图片的文件系统,那么也不用接着往下看了。如果上述条件不具备,只想在普通的硬盘上存储,首先还是要考虑一下物理硬盘的实际处理能力。是 7200 转的还是 15000 转的,实际表现差别就很大。是选择 ReiserFS 还是 Ext3 ,也要测试一下? 创建文件系统的时候 Inode 问题也要加以考虑,选择合适大小的 inode size ,在空间和速度上做取舍,同时防患于未然,注意单个文件系统下文件个数别达到极限。
图片目录
根据垣古不变的真理“越老的图,访问量也相对较少”这一点,分成两大部分,一边处理最新的图片,一边处理老旧的图片。最新的图片访问量大,但存储量较少;老图片访问量低,但存储量大。相应对服务器的要求也不相同,可以按年月来划分新图片和老图片,方便后期的数据迁移。
独立的服务器
无论从管理上,还是从性能上看,只要有可能,尽量部署独立的图片服务器。具备独立的图片服务器或者服务器集群后,在 Web 服务器上就可以有针对性的进行配置优化。采用轻量级的Lighttpd、Nginx,不采用apache,apache最消耗内存.
图片同步
考虑几台图片服务器上同步图片的问题,采用操作系统层分布式文件系统本身的同步功能
采用应用层分布式文件系统同步方案:FastDFS、MogileFS、Hadoop HDFS
采用应用层第三方软件同步方案:csync2+inotify、rsync、unison、DRBD、tsync
如果不想在几台机器间同步所有图片可以采用如下两种方式:
1、NFS共享方式
NFS是个分布式的客户机/服务器文件系统,NFS的实质在于用户间计算机的共享,用户可以联结到共享计算机并象访问本地硬盘一样访问共享计算机上的文件。
具体实现思路是:web服务器通过nfs挂载多台图片服务器export出来的目录,用户先将图片上传到web服务器,然后将上传的图片通过程序拷 贝到这个mount目录中去,这样那几台图片服务器就也能访问到刚上传的图片了(注意,只是共享了,并没有真正拷贝到图片服务器)。再给那几台图片服务器 绑定独立域名,于是浏览器端就可以用单独的域名来访问图片了。这种方式基本不会有因同步造成的延时,但需要依赖nfs,nfs挂掉会影响web服务器。为 了更直观的表达,我还是上一幅图吧,画得比较粗糙,大家将就着看看。
2、利用FTP同步
和上面nfs不一样的是,用户上传完图片后是利用ftp同步到各个图片服务器的,php、java、asp.net基本上都能操作ftp。这样的话 每个图片服务器就都保存一份图片的副本,也起到了备份的作用。但是缺点是将图片ftp到服务器比较耗时,如果异步去同步的话又会有延时,不过一般的小图片 文件也还好了。
独立的域名
如果大部分 Web 页面必须要载入很多图片,建议采用独立的图片命名,注意不是子域名。使用独立的图片域名除了管理方便,便于CDN 同步处理,连接数限制和Cookie也是个考虑因素。
雅虎 Web 优化 14 条
关于雅虎 YSlow 工具倡导的优化14条原则,建议每个 Web 维护人员必须倒背如流,当然也应该辩证来看–介绍这 14 条规则的页面本身也只能得到 70 多分。
客户端 Cache
很多网站的 UI 设计人员为了达到某些视觉效果,会在一些用户需要频繁访问的页面模块上应用大量的图片。这样的情况,对于用户粘度比较高的站点, 在Web 服务器上对这一类对象设置Expires Header(Expires、Cache-Control、Etag、Last-Modified参数设置)就是十分有必要的,大量带宽就这么节省下来,费用也节省了下来。
服务器端Cache及反向代理
在国内,CDN 也是有钱才能玩得起。而类似 Amazon S3 这样的一揽子存储服务,国内还没有出现。所以,充分利用服务器端的 Cache 也是有必要的。Squid,Varnish作为反向代理服务器,缓冲图片效果应该说尚可,或者Lighttpd+mod_mem_cache。
服务器端做Cache的好处是显而易见的,一个数据对象的请求时间会控制在 100ms 以内,否则的话,至少要几百个 ms 甚至更长。
运营问题
图片按需生成、图片预先生成、根据应用场景降低图片分辨率,对那些”截屏”得来的图片做个转换,投入成本可能远比存 储上的开销小,而用户再访问该图片,质量未必能有什么损失,浏览速度无疑好多了。哪种处理方式更让人接受,不言而喻。
防盗链
如果服务不允许防盗链,那么访问量会引起带宽、服务器压力等问题。防盗链可以通过Apache的mod_rewrite实现,限制访问图片的主机域名。或是利用http协议中的referer字段。简言之,HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。
图片处理工具的选择
可能大多数网站都是选择 ImageMagick 做为基础库,不过GraphicsMagick更好,如果图片处理量巨大,性能问题又怎能不考虑?