系统管理员或开发人员有许多理由选择采用一种多站点配置在同一个服务器上托管多个站点。例如以下这种配置:
- 使您能够构建一个高效的开发环境
- 允许您在公开站点之前暂存并测试它
- 允许在同一个站点上运行不同软件
- 支持跨多个站点共享单个代码库
- 利用共享的托管主机
- 允许在同一个服务器上运行类似的安全(基于安全套接字层的 HTTP [HTTPS])和标准 (HTTP) 站点
- 简化服务器管理
但是,不是所有这些理由都可以通过 Drupal 的多站点特性得到最好的处理。本文将重点介绍一种战略:如何使 Drupal 内置的多站点支持在单个 Drupal 实例中创建和提供多个站点。
使用 Drupal 内容管理系统 (CMS) 创建多站点配置具有多项明显的优势,其中一个优势是它可能最容易设置和维护的配置。另一个优势是数据重复率得以最小化,因为 Drupal 仅安装在服务器的某个位置上。最后,Drupal 拥有丰富的贡献模块,可用于完善多站点处理,向布局的所有站点提供高级功能。结合使用新增的特性和简化的管理,任何希望设置和管理多站点布局的人都能从中受益。尽管如此,使用这种配置也有一些缺陷,其中两个特别值得一提的缺陷是:安全性和共享。
多站点安装中的站点共享相同的代码,进而共享相同的文件。结果是,对于任何获取了服务器中某个站点的文件系统的访问权的人,他可以访问用于该多站点安装上的所有站点的文件。因此,在不同的人管理布局中的不同站点的情况下,这可能不太安全。如果站点之间的安全性是一个主要问题,或者如果不同人管理不同的站点,那么 Drupal 的内置多站点功能可能不是最佳的解决方案。相反,可考虑为每个站点提供自己的不同 Drupal 实例。尽管多站点布局带来更容易管理的优势将会失去,但您的站点可以更有效地避免出现意外情况。
第二个问题(共享)与数据库访问密切相关。尽管 Drupal 的多个站点可以共享相同的源代码,但它们不共享相同的数据库数据。因此,在默认情况下,无法从其他站点访问某个站点中的节点、用户和注释。此行为实际上可被视为一种优势,但在管理员可能需要所有站点共享信息的情形下,这可能体现为 Drupal 的多站点特性的设计不足。无论如何,Drupal 内置多站点支持的最佳平衡点是,模块、主题和上传的文件可以跨所有站点进行共享。此外,相同或自定义的文件可保留在配置好的不同站点所对应的不同文件夹中。如果共享所有内容非常重要,那么可以考虑使用多域特性,该特性很容易通过同名模块实现。
下载 Drupal 压缩文件后(请参阅 参考资料,以获取相关链接),解压文件并将得到的文件夹复制到 Web 服务器的文档根目录中。采用适当的 FTP 客户端,此任务很容易完成;在使用服务器的安全 Shell (SSH) 方法的情况下,此任务更容易完成。运行 wget
命令从存储库下载该压缩文件,解压该文件,生成 Drupal 安装文件夹。(如果开发环境是本地的,则支持更多的选项。)。将安装文件夹命名为 /goodsite
。
我们将为此练习创建 3 个不同的站点;因此,需要 3 个不同的数据库,一个数据库对应一个站点。如果使用来自服务器的 Cpanel 的 phpMyadmin,那么此任务很容易完成。接下来安装框架。但是,在使用 Web 浏览器运行安装程序之前,必须执行两个任务:
- 为 Drupal 提供您要运行的站点的信息。
- 将特定于站点的配置数据从 Drupal 传递到所有站点。
要完成第一个任务,需要为每个站点创建一个特殊目录。对于第二个任务,可以找到每个目录中的一个设置文件。目的是设置一个包含两个子站点的主安装。每个子站点共享与核心相同的文件,但每个子站点拥有自己独立的 URL 和数据库。要创建站点的 URL 为:
- 主站点:http://goodsite.com
- 子站点 1:http://bettersite.com
- 子站点 2:http://bestsite.com
将 Drupal 源代码放在文档根目录下并创建 MySQL 数据库之后,就可以开始安装第一个站点和主要域。
主要域名称是用于访问主站点的 URL(在本文中是 http://goodsite.com)。主要域主要用于托管基础 Drupal 安装。无论此域是否用作您的一个站点,如果任何子站点发生故障,默认情况下会将它们的 URL 都设置为主要域;因此,在此站点中包含与子站点相关的信息(比如联系信息)是一个不错的想法。
前面已经提到过,对于每个子站点,必须在主要 Drupal 文件夹中创建一个子文件夹。可以想象,Drupal 的多站点安装中最困难的任务就是简单的例行任务:让 Drupal 知道您希望托管哪些站点,并在 /sites 文件夹中为这些站点创建子文件夹。
Drupal 主要根文件夹中有一个名为 /sites 的目录。如果之前管理过 Drupal,您一定知道所有非核心代码都应放在此文件夹中。在默认的 Drupal 安装中,/sites 文件夹包含两个目录。第一个称为 all/,是放置下载的主题和模块的地方。all/ 目录是放置在所有站点之间共享的信息的位置。第二个文件夹名为 default/,是用来保存配置文件的地方,非核心的和自定义的主题和模块也存放在这里。Drupal 通常在 default/ 目录中搜索站点配置信息,无论它是否被要求这么做。但是,请注意,这些仅适用于一般的单主机站点,不一定适用于多站点安装。
构建多站点 Drupal 的一个重要技巧是,将 all/ 和 default/ 文件夹分开,其他文件夹可在 /sites 中创建,Drupal 会为它们分配特殊用途。更具体而言,Drupal 假设 /sites 文件夹中的其他所有目录表示一种主机名或主机名模式。
在 /sites 文件夹下的模式 /goodsite/sites/<sub-site>
中为所有子站点创建一个子目录,用您想要的 URL 代替每个子站点文件夹的名称。在本例中,您拥有以下子站点,如 图 1 所示。
- 子站点 1:/goodsite/sites/bettersite
- 子站点 2:/goodsite/sites/bestsite
对于每个子站点,需要完成以下步骤:
- 将文件 default.settings.php 从 sites/default 复制到每个子站点文件夹,将它重命名为
settings.php
。 - 使用
CHMOD
将 settings.php 上的权限设置为 644,如果它不是当前的权限。 - 对于 Drupal, Version 6 安装,在每个子站点下创建一个名为
files
的文件夹,使用CHMOD
将权限更改为 755。Drupal 能够将内容写入该文件夹中,这些内容通常是上传的文件、图像缩略图、聚合的级联样式表 (CSS) 和 JavaScript 文件。这些文件未存储在数据库中,而是存储在文件系统中,所以您必须提供一个可放入这些文件的目录。
默认情况下,Drupal 在每个站点的目录中查找一个名为 files/ 的子目录。在默认 Drupal 安装中,该文件夹位于 sites/default/files/ 中。
- 为每个子站点创建一个名为
modules
的文件夹。这是任何特定于该子站点的模块所在的文件夹中。所有站点将要使用的全部模块都应位于 sites/all/modules 文件夹中。
- 为每个子站点创建一个名为
themes
的文件夹。这是任何特定于该子站点的主题所在的地方。所有站点将要使用的全部主题都应位于 sites/all/themes 中。
现在,如果子站点不是由同一个托管公司管理的,请将子站点 URL 指向您的 Web 服务器。如果对各种站点使用不同的主机,则需要更改域名系统 (DNS) 信息(登记和托管公司都能告诉您如何做)。因此,必须将该域 “停放” 在您的主要域(在本例中为 goodsite.com)之上。在这里,您有许多备用选项,比较困难的选项涉及到使用所谓的 symlink。但是停放要简单得多;所以在 Cpanel 中,单击Parked Domains。将 bettersite.com 和 bestsite.com 添加在 New Domain Name 中,然后单击 Add Domain。
这里有多种方式可供使用,但再一次声明,让我们采用最容易的方法:直接加载每个站点的数据库,其中包含主要站点安装中创建的表。为此,必须从主要站点安装创建数据库表的转储,并将它保存在本地。然后,使用 phpMyadmin 上传此文件,或者使用代码编辑器打开它。要使用第二个选项,请在 phpMyadmin 中执行以下任务:
- 转到为子站点创建的数据库。
- 转到 SQL,然后将所有来自结构化查询语言 (SQL) 转储的代码粘贴到这里。
- 单击 Go。
此过程会在子站点数据库中复制主要站点数据库。
接下来,打开每个子站点的 settings.php 文件,查找以下行:
$db_url = 'mysql://username:password@localhost/databasename'; |
更改这个数据库连接字符串,以反映子站点数据库的参数(用户名、密码、主机名和数据库名)。现在,如果转到 bettersite.com,那么您应看到标准的 “Welcome to your new Drupal website” 页面,如 图 2 所示。请对其他所有站点重复这些步骤。
还有一种快速创建多站点的方法,那就是首先从 Cpanel 将它们设计为子域。但是,在此方法中,必须在最开始的时候在 /goodsite/sites 下创建每个站点的文件夹,这一次使用以下惯例(参见 图 3):
- 子站点 1:/www/goodsite/sites/ bettersite.com
- 子站点 2:/www/goodsite/sites/ bestsite.com
请注意,子域文件夹必须与子域本身同名。和之前一样,将 default.settings.php 的一个副本放在每个子域文件夹中,将文件名称更改为 settings.php
,然后执行 CHMOD
将权限更改为 644。
现在,返回到 Cpanel 并创建两个子域:
- bettersite.goodsite.com
- bestsite.goodsite.com
symlink 是一个文件,其中包含以绝对或相对路径形式对另一个文件或文件夹的引用,创建它的目的是为了帮助解析路径名。使用任何代码编辑器创建一个名为 symlink.php
的文件,然后添加以下类似代码:
<?php symlink( '/home/Cpanel_User_Name/public_html/', 'sub-domain' ); ?> |
在本例中,该文件类似于:
<?php symlink('/home/myuserdirectory/goodsite/','bettersite'); symlink('/home/myuserdirectory/goodsite/','bestsite'); ?> |
将此 symlink 放在主要站点的主要目录中,从 URL http://goodsite.com/symlink.php 运行它。如果代码语法没有问题,您应该会看到一个空白页;否则您会看到错误消息。调整此文件中的代码,直到正确显示该页面。
现在在任何代码编辑器中打开 .htaccess 文件。查找以下代码行:
# RewriteBase/ |
删除井号 (#
),保存更改之前添加以下代码行:
RedirectMatch 301 ^/sub-domain/(.*)$ http://sub-domain.yoursite.com $1 |
以下是完成后的 .htaccess:
RewriteBase / RedirectMatch 301 ^/bettersite/(.*)$ http://bettersite.goodsite.com/$1 RedirectMatch 301 ^/bestsite/(.*)$http://bestsite.goodsite.com/$1 |
这个重定向使 http://goodsite.com/bettersite 和 http://bettersite.goodsite.com 都可重定向到同一个站点。如果所有操作已正确完成,那么在访问子站点 URL http://bettersite.goodsite.com 和 http://bestsite.goodsite.com 时,您应该被定向到安装页面。
安装所有站点后,可以从 Cpanel 利用重定向轻松地将站点 http://bettersite.goodsite.com 关联到 URL http://bettersite.com。
在 Ubuntu 上运行多站点安装比您目前执行的远程托管稍微复杂一点。可使用以下各节中列出的方法轻松配置多站点安装。
首先使用以下代码在主目录中创建一个名为 goodsite 的文件夹:
>> filesystem/home/<your ubuntu login name>/ |
结果应为 -> /home/<your ubuntu login name>/goodsite
。
现在将所有 Drupal 文件复制到此文件夹中。
使用以下命令打开一个终端窗口来编辑 hosts 文件:
sudo gedit /etc/hosts' |
然后以 127.0.0.1 mysite.com
格式添加任何站点名。对于本示例,可以添加以下代码行:
127.0.0.1 goodsite.com 127.0.0.1 bettersite.com 127.0.0.1 bestsite.com |
现在使用以下命令转到 sites-available 文件夹,创建一个名为 goodsite.com 的文件:
cd /etc/apache2/sites-available sudo cp default goodsite.com sudo gedit goodsite.com |
第一个命令转到 sites-available 文件夹;第二个命令复制默认文件,并将它重命名为 goodsite.com。第三个命令打开文件 goodsite.com 进行编辑。将 清单 1 中所示的代码添加到该文件中。
清单 1. 向 sites-available 文件夹添加新站点的文件
<VirtualHost *:80> ServerAdmin webmaster@localhost ServerName goodsite.com DocumentRoot /home/<your ubuntu login name>/goodsite <Directory /> Options FollowSymLinks AllowOverride All </Directory> </VirtualHost> |
保存 goodsite.com,启用它,然后使用以下命令重新加载 Apache:
sudo a2ensite mysite.com sudo /etc/init.d/apache2 reload |
在 /sites 文件夹中创建您的子站点 /home/[您的 ubuntu 登录名]/goodsite/sites/bettersite.com,然后将 settings.php 添加到新文件夹中。如果您已导航到 sites/ 目录,那么可以使用以下命令复制 settings.php 文件:
$ cp default/default.settings.php bettersite.com/settings.php $ chmod 777 bettersite.com/settings.php |
打开浏览器,然后键入 http://bettersite.com
。您应该看到安装设置页面。再次将 settings.php 文件设置为只读,以避免安全消息,然后运行子站点安装。
接下来,创建一个站点文件夹,并运行 bestsite.com 以及您的主机配置中提及的任何其他子站点的安装。
模块用于扩展基本 Drupal 安装的功能,分为各种类别,从管理性功能到实际的性能增强功能。一些模块可帮助创建一种多站点或类似配置。有关使用这些模块的详细信息,请参阅每个模块的安装文档。
Domain Access 模块(请参阅 参考资料,以获取相关链接)支持使用单个代码库、共享的用户数据库以及具有共享登录名但具有不同内容的数据库来创建多站点。这样一种配置不同于本文中所完成的配置。Domain Access 实际描述为一组模块,它们使用安装在单个共享数据库中的基本 Drupal 代码来简化一组站点的运行。这些模块支持所有站点共享用户、内容和设置,只要它们已配置为以这种方式进行操作。Domain Access 模块使用 Drupal 的 Node Access System 确定应在多站点布局中的每个站点上提供哪些内容。不同于其他多域模块,这些模块还根据用户正在查看的活动域来控制用户访问,而不是根据用户所属的组或站点。
Multisite Manager(请参阅 参考资料,以获取相关链接)是一个贡献的模块,允许从基础 Drupal 站点创建新的 Drupal 站点,无需访问安装数据库。默认情况下,新站点安装在与基础安装相同的数据库中,但具有不同的前缀。否则,如果当前用户拥有创建一个数据库的访问权限,安装可以在该数据库中完成。
本文探讨了如何使用 Drupal 作为基础 CMS 来创建多站点配置。您可安装主要站点,并将子站点放在它的目录结构中。您可学习如何在一个远程服务器上使用托管公司所提供的管理工具来运行多站点安装。您还学习了如何在本地机器上创建一个多站点安装 — 具体来讲,是在一个运行 Ubuntu Linux® 的计算机上。本文还介绍了两种 Drupal 模块,它们可帮助您创建多站点和多域配置。