2012年1月16日星期一

用 Drupal 架设多站点同步(Master/Slave)


目标:
一个主站点 www.master.com
多个子站点 www.slave1.com、www.slave2.com…
站点间用户同步,登陆状态(session)同步……
使用drupal架设,只需要一套drupal代码根据不同站点的不同配置文件分割,当然也可以用多套代码。
配置文件:
  • sites/default/settings.php – for master.com
  • sites/www.slave1.com/settings.php – for slave1.com
  • sites/www.slave2.com/settings.php – for slave2.com
共享用户
分别安装master.com、slave1.com和slave2.com的drupal,安装的时候设置数据表前缀(master_、slave1_和slave2_)
修改sites/www.slave1.com/settings.php

1
2
3
4
5
6
7
8
9
10
11
$db_prefix = array(
    'default' => 'slave1_',    // slave1.com 的表前缀为 slave1_
    'authmap' => 'master_',    // 对于共享的用户表使用主站master.com的数据, 表前缀为 master_
    'profile_fields' => 'master_',
    'profile_values' => 'master_',
    'role' => 'master_',
    'sequences' => 'master_',
    'sessions' => 'master_',
    'users' => 'master_',
    'users_roles' => 'master_',
);
修改sites/www.slave2.com/settings.php
1
2
3
4
5
6
7
8
9
10
11
$db_prefix = array(
    'default' => 'slave2_',    // slave2.com 的表前缀为 slave2_
    'authmap' => 'master_',    // 对于共享的用户表使用主站master.com的数据, 表前缀为 master_
    'profile_fields' => 'master_',
    'profile_values' => 'master_',
    'role' => 'master_',
    'sequences' => 'master_',
    'sessions' => 'master_',
    'users' => 'master_',
    'users_roles' => 'master_',
);
这样,就实现了用户同步,现在可以在任意一个站点注册新用户,然后到其他站点登陆作为测试。
session同步
下载Shared Sign-On
在各个站点都安装Shared Sign-On
在这个例子里master.com是主站点,所以设置所有的站点(包括主站点)的Shared Sign-On Master URL 为http://www.master.com/
好了,现在可以做到 session 同步了
还有高级点的多站点代码分开的实现可以参考 http://drupal.org/node/291373


小站本来是用两套drupal应用程序来管理两个站点的,数据库与drupal程序是1v1的关系。随即发现这样容易产生(1)安全漏洞,而且(2)管理,维护起来十分不便。听闻drupal 有一套很好的多站点管理机制,于是就google一下。
根据指引,我又重新回到了drupal程序里自带的INSTALL.txt中求解。
我希望达到如下需求:
1 . 用顶极域名停泊一个站。即 现在的 http://arpoon.info/ .
2 . 其他子站都以目录的形式来展示:比如我的中文站用 : http://arpoon.info/zh 作为入口。
3 . 各个站点都可以单独配置,单独展示,互不冲突。
4 . 各个子站独享一个数据库。
参考了INSTALL.txt 后,我惊喜地发现,里面的方法可以完全满足我的需要!太好了!现在翻译出来,给有需要的朋友 ^^

多站配置
-----------------------

了解了drupal的目录配置,我们回到第二点要求上,怎么能让站点通过http://example.com/sub 的方式访问呢? 方法很简单:只要在服务器的drupal根目录下建立一个symbol link 就可以了,比如要通过 http://arpoon.info/zh 来访问中文子站,那么就把zh目录建立在arpoon.info 根目录里:
 
---DRUPAL_ROOT
|---files
|---includes
|---misc
|---modules
|---profiles
|---scripts
|---sites
|---themes
单套drupal安装程序可以管理多个用drupal搭建的站。而且每个站点都可以有自己个性化的配置。
除了主站(第一个建立的drupal站)之外,新加入的子站点目录都应该配置在sites 目录下(sites是drupal根目录下的一个子目录,可参考drupal架构研究--目录组织结构梳理)。每一个子站目录都应该有一个'settings.php' 来指明配置信息。
最简单的方法是直接copy ./site/default/ 下 的settings.php到子站目录中。
新的子站目录有站点的url构成。如:对于新增站点: www.example.com ,那么其配置文件settings.php 就应该是 sites/example.com/settings.php (注意这里如果我们可以通过'http://example.com来访问的话,目录名中的'www'是应该省略的).
当然新加入的站点不一定要一个不同的域名。可以把站点停靠在一个子域名上或者原有的drupal站的子目录下。例如可以是:example.com,sub.example.com,sub.example.com/site3 .这些都可以用在独立的drupal站上。那么相应的服务器上的配置应该是像下面这样:
 
sites/default/settings.php
sites/example.com/settings.php
sites/sub.example.com/settings.php
sites/sub.example.com.site3/settings.php
当drupal为站点查找配置信息时,(如  www.sub.example.com/site3), 就会按照下面的顺序来查找配置,并会先应用第一个找到的配置来设置站点.
 
sites/www.sub.example.com.site3/settings.php
sites/sub.example.com.site3/settings.php
sites/example.com.site3/settings.php
sites/www.sub.example.com/settings.php
sites/sub.example.com/settings.php
sites/example.com/settings.php
sites/default/settings.php
如果你配置时没有用标准的http服务端口,那么这个端口将会当作最深层的子域名,例如:http://www.example.com:8080/ 的配置将通过读取sites/8080.www.example.com/目录下的配置来运行。如果没有指定端口,那么drupal 将忽略带端口的目录,而读取没带端口的目录中的配置文件。就像一个真实子域名一样对待。
除了安装在标准目录中的模块和界面主题外,每一个站点都会有它自己的模块和界面主题。要用特定的模块和界面主题,可以在你的子站目录下建立一个'modules'和'themes'目录如下:
 
+----arpoon.info (主站根目录)
+----sites
| +----arpoon.info.zh (子站根目录)
又例如:如果sub.example.com 有一个定制的theme 和一个定制的module,并且是只供此子站所用,不与其他站共享,那么就应该配置如下:
sites/sub.example.com/:
settings.php
themes/custom_theme
modules/custom_module

没有评论:

发表评论

上海松善实业有限公司

    上海松善实业有限公司是一家集多品牌销售于一体的电线电缆骨干企业,公司成立于2016年。 公司拥有国内各大品牌:起帆、远东、上上、江南、胜华等。     主要产品有:高低压电力电缆、橡套电缆、控制电缆、架空绝缘电缆、塑胶电缆、电子计算机电缆、通讯电缆、...