You are here

Drupal专业开发指南 第22章 文件上传和同步

文件上传和同步

Drupal运行在单个web服务器上时,上传的文件一般存储在Drupal的files(文件)目录中。它的位置可在“管理➤站点配置➤文件系统”里配置。对于多个web服务器,则需要避免下面的场景:
 
1. 一个用户在web服务器A上,上传了一个文件;数据库被更新以反映这一情况。
2. 一个用户在web服务器B上查看一个页面时,引用了这个新文件。文件未找到!
 
很明显,答案就是将文件也同步到web服务器B上。有多种方式。
 
使用rsync
Rsync程序是一个解决方案,它通过仅仅复制修改了的文件来保持两个目录间的同步。更多信息,参看http://samba.anu.edu.au/rsync/。这种方式的不足之处是,同步会带来延迟,还有所有上传了的文件都有多个副本(因此增加了存储成本)。
提示 如果你有很多文件并定期的调度rsyncs,通过检查表file和upload,当文件未被修改时,不同步;文件被修改时,同步。
 
使用一个共享的固定的文件系统
与其在多个服务器间同步文件系统,你不如部署一个共享的固定的文件系统,它将文件存放在文件服务器上的一个单独的位置中。接着,web服务器可以使用一个协议比如网络文件系统(NFS)来安放文件。这种方式的优点有,能够很容易的添加廉价的web服务器,而资源将被集中存放在一个耐用的文件服务器上,它上面可以带有冗余存储系统比如RAID 5。这个系统的主要缺点是,仅有一个失败点;如果你的服务器或者文件系统出了问题,那么就会影响整个站点,除非你创建一个文件服务器集群。
如果需要提供大量的多媒体文件,最好将这些文件存放在一个单独的服务器上,可以使用一个轻量级的服务器比如Lighttpd,从而减轻你的web服务器的负担,使得Drupal能够处理更多的请求。做到这一点的一个简单的方式是,在你的web服务器上使用一个重写(rewrite)规则,将到来的针对特定文件类型的所有请求重定向到静态服务器上。下面是Apache的重写(rewrite)规则的一个例子,它重写了所有针对JPEG文件的请求:
RewriteCond %{REQUEST_URI} ^/(.*\.jpg)$ [NC]
RewriteRule .* http://static.example.com/%1 [R]
这种方式的不足是,web服务器仍然需要处理额外的工作——将请求重定向到文件服务器上。一个改进的方案是,在Drupal内部重写所有文件的URLs,这样web服务器就不再参与静态文件请求了。然而,现在,在Drupal内核里还没有一个简单的方式来进行修改。
 
超越单个文件系统
如果存储总量不断增长,以至于超过了单个文件系统能够承受的范围,你可以通过编写定制的代码来实现一个存储抽象层,从而满足需求。另一种选择是使用一个外部的存储系统比如Amazon的S3服务。
 

Drupal版本: