Drupal的多站点或站群功能实现

Drupal的多站点或站群功能实现

10月 30, 2019     liumwei

多站点或站群是目前高校和公司较流行的网站系统模式,其主要出发点在于:各部门之间彼此功能差异不大,但又需要有各自独立的站点。同时,对于信息部门而言,多站点或站群模式可以减少运行维护成本,可实所有站点的快速升级、功能新增等。

当然,它已有缺陷,比如一个站点的大流量访问或安全问题,会影响其他站点。因此,多站点的维护和更新应前期反复测试,采用各自独立的数据库,代码最好采用版本控制系统,如git,并同时使用Composer这样的软件包管理器。尽管如此,基于多站点的管理方式其优势还是很明显的。而且,如果结合Docker等工具,如https://github.com/mbunge/multi-site-docker来进行多站点部署。问题是,Drupal的多站点是如何配置的呢?以下是主要的配置测试过程:

1.  本地测试环境配置

毫无置疑的是,Drupal首当其中的环境是LAMP(如何安装,请看这个页面)。其次是,基于localhost的域名虚拟。具体可如下操作:

Debian/Ubuntu Linux下,可配置/etc/hosts。而Windows系统则配置C:\Windows\System32\drivers\etc\hosts,添加如下代码(一定记得保存):

127.0.1.1   www.liumwei.com
#127.0.1.1   www.liumwei.cn

通过删除配制,为本地计算机虚拟了两个域名:www.liumwei.comwww.liumwei.cn,一旦保存,就可以基于浏览器进行访问。值得注意的是,这样的域名,可以任意填写,只不过从浏览器访问的时候,只是访问本地计算机。

2. 配制网络服务器Apache2

Debian/Ubuntu Linux下,可配置/etc/apache2/sites-enabled/,在其下新建两个配制文件。这两个配制文件的内容大同小异,主要差异在域名上,DocumentRoot的路径参数完全一样,指定到同一个Drupal代码文件夹上。相关内容如下:

<VirtualHost *:80> 
        ServerName www.liumwei.com
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/drupal-7.67-mutisites
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>

        <Directory /var/www/drupal-7.67-mutisites>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>
   
        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>


               #RewriteEngine on
               #RewriteCond %{SERVER_PORT} 80
               #RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

因为虚拟了两个域名,因此,另外域名的配置文件预测类似

<VirtualHost *:80> 
        ServerName www.ilabmed.cn
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/drupal-7.67-mutisites
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>

        <Directory /var/www/drupal-7.67-mutisites>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>
   
        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

               #RewriteEngine on
               #RewriteCond %{SERVER_PORT} 80
               #RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

3. 上述动作完成后,重启Apache2服务器

sudo service apache2 restart

4. 下载Drupal核心程序代码,针对两个站点进行文件夹创建和操作

假定Drupal7.67的核心代码下载后,被解压到/var/www/html/drupal7.67。然后在drupal7.67/sites下创建www.liumwei.comwww.liumwei.cn两个目录(目录文件名与前面的虚拟域名必须完全相同!若不相同,则需要在sites.php进行配置),并这两个目录下各自创建modules、libraries、themes、translations和files目录,并将这几个目录设置为可读写。将两个站点都使用的模块、主题、第三方库等都放到sites/all下相应的目录中,而将站点各自特定使用的模块、主题、第三方库放到刚才创建的modules、libraries、themes、translations等目录中。同时,将sites目录中的example.sites.php复i制为settings.php,将sites/default/default.settings.php分别复制到两个站点目录下的。 相关的文件目录结构如下:

 |
 |
sites
  |--all
  |   |--libraries
  |   |--modules
  |   |--themes
  |   |--translations
  |   
  |--default   
  |   |---default.settings.php
  |   |---files
  |       |---primate
  | 
  |--example.sites.php
  |--sites.php
  |
  |--www.liumwei.com
  |      |---default.settings.php
  |      |---libraries
  |      |---modules
  |      |---themes
  |      |---translations
  |      |---files
  |           |---primate
  |
  |--www.liumwei.cn          
  |      |---default.settings.php
  |      |---libraries
  |      |---modules
  |      |---themes
  |      |---translations
  |      |---files
  |           |---primate

* 这是开启多站点的必要步骤。蓝色的文件和文件夹结构缺一不可。每个站点顶层文件夹与域名完全一样,如果不是(例如在sites下建立site1he site2作为两个站点顶层目录名),需在sites.php行末加上如下的字样:

$sites = array(
  'www.liumwei.com' => 'site1',
  'www.liumwei.cn' => 'site2',
);

5. 在浏览器中,分别键入www.liumwei.comwww.liumwei.cn开启Drupal安装

安装完毕,两个站点www.liumwei.comwww.liumwei.cn即可正常访问(两个站点会各自生成settings.php),此时可使用drush命令,为站点进行数据更新、模块安装。只是需要注意的是,如果是为两个站点安装公共模块,可在两站点的上级目录进行操作。如果是单独为每个站点安装独有的模块,需进入到每个站点目录下进行。

6.  两站点各自文件系统设置(很重要)admin/config/media/file-system

在这个管理页面中,需要注意将Public file system path默认的sites/default/files修改为:sites/www.liumwei.cn/files或sites/www.liumwei.com/files,将Private file system path中的sites/default/files/primate分别修改为sites/www.liumwei.cn/files/primate或sites/www.liumwei.com/files/primate

7. 站点之间的沟通

如果需网站之间共享用户、内容、菜单及跨站检索,可以尝试Domain AccessDomain Menu AccessApache Solr Multisite Search这样的模块。

8. 多站点的管理方式

上述的多站点管理方式,解决了站点核心代码库共享、共管的问题。如果要简化上述管理过程,我们还可以采用Drupal官方推荐的Aegir。这是一个充分利用Drupal Multisites功能的托管系统。

 

参考

https://internetdevels.com/blog/drupal-multisite
https://ninghao.net/blog/400