用Drupal的multisite机制重新部署网站
Drupal社区十分强大且活跃,使得本人不在考虑使用其他的CMS建立网站了。
由于前期的几个网站都是用drupal单独创建的,因此更新维护起来比较麻烦,因此考虑把几个网站重新部署,共用一个代码库。这里不得不提到Drupal支持的multisite机制简直就是太cool了。(其实Drupal在CMS设计理念上的创新还有很多,不是一般的CMS可比的)
Multisite就是很多网站被部署在一个Drupal代码库下,但是站点相对独立。只要改动或升级这份代码库,所有的网站功能都会改变,极大的节省了维护成本,同时还能满足各个站点独特的要求。
安装多站点大概分为两种:一种是在一个网站下全新建立几个新的独立站点;另一种情况是将已有的几个站点合并到一个Drupal系统中。很显然,本人需要做的是第二种情况。
由于已有的网站已经拥有各自的数据库,主题,插件,用户上传文件,临时文件夹等,我们只需要把他们重新部署一下即可,并不需要安装新的multisite站点。经过摸索,发现还是比较容易的:
1. 在主Drupal系统下的sites目录下,为每个独立站点的子域名创建同名目录,subdomain*.domain.com.
在每个新创建的子目录中再创建,files, themes, modules, tmp四个子目录。
在sites/all下面创建themes,modules子目录,存放共用模块和主题。
在sites/default下创建files子目录用于存放公共文件。
2. 建立好所有目录结构以后,分别复制原来Drupal站点目录中files/default/settings.php到对应的sites子目录中(上一步创建的),这个文件中包含原来网站使用的数据库名称和登录信息,可以最直接用于multisite站点,这样合并后的各个网站虽然分享代码,但是还是使用原来的数据库,互不干扰。如果要创建一个全新的multisite,就需要把这个文件中的db信息注释掉,这样当连接子域名时,Drupal会要求重新安装系统,并允许创建全新的数据库。如果不想使用独立的数据库,而是要和主域名的Drupal系统共享一个数据库,为了保证站点的独立性,就需要在settings.php中指定数据表前缀。
3. 接下来要复制原来各个网站上被客户或者管理员定制的目录和文件到新的sites下面的目录中。最简单的办法就是,复制整个files目录到各自的multisite子目录,然后不要忘了以后在登录新的multisite之后,进入管理界面修改文件系统路径。(也可以指定tmp)目录对的样子应该是sites/subdomain.domain.com/files(tmp)
4. 复制所有网站需要共用的模块和主题到sites/all下面的对应目录,而只在特定网站上使用的则分别复制到每个子域名目录下的对应文件夹中。这里再次显示了Drupal的灵活性,独立和统一被完美的结合在一起。
5. 最重要的一步就是如何把子域名关联到新的目录结构上。通常一个子域名对映着根目录上的一个文件夹,里面有CMS系统文件。但是现在我们要废弃这个对应关系,而让子域名可以找到新的multisite路径。再次感谢Drupal,使得一切变得简单,我们需要做的仅仅是:删除或者重命名原来子域名对应的文件夹,然后创建一个同名的符号链接ln -s . subdomainfolder/。这个符号链接指向public_html,或者说安装了Drupal系统的主站目录。至于这个Drupal如何替你找到对应的multisite,不用我们操心了,只要按照上述步骤做了就可以了。
6. 现在在浏览器中直接输入各个子域名,应该会看到和原先一模一样的内容。(如果settings.php不是从老网站上复制过来的,这一步Drupal会提示安装新系统,要求输入数据库信息等。)还有一些细节问题,比如如何重定向files文件夹,如果配置特定共用模块(如coolfilter),就不赘述了。
明白了Drupal的设计之后,觉得配置起来并不是很困难,反而是让人觉得越用越喜欢,这可能就是为什么越来越多的人选择Drupal的原因了。
此过程中有一事不解,干嘛非要创建一个符号链接来指向主站呢?我尝试过使用域名重定向,也就是修改老网站目录中的.htaccess文件,虽然可以使子域名指向主站,但是Drupal就是不能导向新建立的multisite路径,只停留在主站。而用符号链接直接指向主站路径就没问题。很是奇怪。希望有朋友指点。