如何使用Drush迁移和同步Drupal站点
介绍
如果您认为 Drush 非常适合快速安装和更新 Drupal 模块,那么您应该在迁移站点或保持多个站点同步时看到它的实际效果。 如果您 ' 不知道 Drush 是什么,您可以阅读此 入门教程 ,它将帮助您进行设置。 如果你想知道如何使用一些基本的 Drush 命令,你也有 this tutorial 让你快速上手。
在本教程中,您将学习如何使用 Drush 更有效地将站点从一个 VPS 迁移到另一个 VPS,管理多个站点并在它们之间轻松同步。 它假定您正在运行自己的云服务器,上面安装了 Drush,并且已经安装了 Drupal 站点。
Drush 别名
使用 Drush 执行操作时,通常您必须在 Drupal 文件夹中键入命令。 当只需要处理一个 Drupal 安装时,这不是问题。 但是在某些情况下,我们将在本教程中看到,您需要管理多个站点。 幸运的是,Drush 有一个惊人的功能,称为 aliases。
Drush 别名是一组简单的配置,允许您使用以下格式 @site 的快捷方式从服务器 ' 文件夹结构中的任何位置引用 Drupal 站点。 不过,在能够使用这些快捷方式之前,您需要配置相应的别名。 为此,如果您还没有 ',请在服务器 ' 中的 .drush 文件夹中创建一个名为 aliases.drushrc.php 的文件s 根文件夹:
nano /root/.drush/aliases.drushrc.php
在这里,您必须为文件创建一个 php 开始标记 <?php
,并在下面复制以下数组声明:
$aliases['site1'] = array( 'root' => '/var/www/drupal_folder', 'uri' => '88.88.88.88/drupal_folder', );
让我们看看这意味着什么。 数组键 site1 将成为您 ' 将能够通过 Drush 引用此站点的快捷方式名称(您可以将其替换为任何您想要的)。 在 $aliases 数组中, root 键应该有一个值作为您的 Drupal 站点的目录,而 uri 键应该有一个值作为 URI网站。
在这个例子中,我使用了一个虚拟 VPS 的 IP 地址。 您应该将其替换为您的或您的域名。 确保这是引用您当前所在的云服务器,而不是远程服务器(我们也会稍作介绍)。
保存文件,退出,并设置别名。 要对其进行测试,请导航到 Drupal 站点之外的文件夹并运行以下命令:
drush @site1 status
现在您应该获得有关您刚刚在别名中引用的站点的常规状态信息。 您也可以将此快捷方式与其他命令一起使用。
迁移站点
既然您知道如何引用站点,我们可以看看使用 Drush 将站点从一个文件夹迁移(复制)到另一个文件夹。 让 ' 假设您要将 @site1 从 /var/www/drupal_folder 移动到 /var/www/drupal_folder2。
首先,您需要为以后的安装创建一个新别名。 为此,像往常一样,编辑 aliases.drushrc.php 文件:
nano /root/.drush/aliases.drushrc.php
在这里,您需要创建以下两个别名,它们都具有相同的格式。 只需复制粘贴旧的并进行适当的更改:
$aliases['site2'] = array( 'root' => '/var/www/drupal_folder2', 'uri' => '88.88.88.88/drupal_folder2', );
保存文件并退出。 如果您运行 drush @site2 status,它将不起作用,因为显然该文件夹不仅不包含 Drupal 安装,而且 ' 甚至不存在。 所以让我们创建它:
mkdir /var/www/drupal_folder2
为了准备新的 Drupal 安装,您还需要创建一个新数据库。 因此,通过您喜欢的方式登录您的 MySQL 并创建一个新数据库,记下访问用户名和密码。 如果您不确定如何执行此操作,请阅读说明如何 使用 Drush 部署 Drupal 站点的教程。
现在您的数据库已设置完毕,您可以继续迁移站点。 要将所有代码库从第一个文件夹复制到另一个文件夹,请运行以下命令:
drush core-rsync @site1 @site2 --include-conf
这样做是将所有文件从 drupal_folder 复制到 drupal_folder2,包括 settings.php 文件,因为 --include-conf ] 选项。 如果您在没有最后一个选项的情况下运行该命令,则 settings.php 文件不会包含在副本中,这是一个很棒的功能,因为您在同步站点时不需要 ' 复制此文件。
现在,在 drupal_folder2 副本中编辑这个新复制的 settings.php 文件并更改数据库信息以反映您刚刚创建的新数据库。
nano /var/www/drupal_folder2/sites/default/settings.php
在此文件中,您需要更改以下代码块以反映您自己的数据库信息:
$databases = array ( 'default' => array ( 'default' => array ( 'database' => 'your_db', 'username' => 'your_username', 'password' => 'your_password', 'host' => 'localhost', 'port' => '', 'driver' => 'mysql', 'prefix' => '', ), ), );
保存文件并退出。 现在您还可以使用 Drush 迁移数据库,因为它知道 drupal_folder2 中的站点现在使用此数据库,即使它 ' 当前为空。 您需要做的就是运行以下命令:
drush sql-sync @site1 @site2 --create-db
由于 --create-db 选项,这将删除与 @site2 关联的数据库中的表(当前为空的表)并插入与关联的数据库中的表@site1 - 你原来的 Drupal 安装。 所以现在你有同一个站点的 2 个精确副本。
您可能会遇到以下错误消息(使用适用的凭据):
ERROR 1044 (42000) at line 1: Access denied for user 'your_username'@'localhost' to database 'your_db'
如果是这种情况,请确保您的用户具有所需的权限。
登录 MySQL (mysql -u root -p
)。
授予以下权限:
grant all privileges on your_db.* to your_username@localhost with grant option; grant reload on *.* to druser2@localhost; flush privileges;
同步 Drupal 站点
现在您拥有原始站点 (@site2) 的副本,您可以将其用于开发工作。 如果您对其进行代码库修改,您可以使用 core-rsync 命令将文件与原始文件同步 (@site1):
drush core-rsync @site2 @site1
显然,您不想再次复制 settings.php 文件,这会阻止再次更改数据库。 接下来,要同步数据库,运行相同的 sql-sync 命令:
drush sql-sync @site2 @site1 --create-db
在大多数情况下,' 建议在复制之前清空接收数据库(使用 --create-db 选项),以避免数据库中保存的配置冲突导致问题。
远程站点
我们已经看到在同一台服务器上处理多个站点是多么容易,但是如果您有多个站点分散在多个服务器上怎么办? 对于 Drush,区别在于您在别名中提供的信息。 但是,为了使用 Drush 在远程主机上工作,您需要在两台服务器之间设置 SSH 密钥并在两台服务器上都安装 Drush。
完成这些步骤后,让我们看看如何配置别名以便远程连接。 像往常一样,打开并编辑第一台服务器上的 aliases.drushrc.php 文件(您之前'一直在处理的那个):
nano /root/.drush/aliases.drushrc.php
让我们为远程服务器上的站点创建一个新别名。 复制下面的代码并用您的信息适当地替换:
$aliases['site3'] = array( 'root' => '/var/www/drupal_folder3', 'uri' => '99.99.99.99/drupal_folder3', 'remote-host' => '99.99.99.99' );
那么这是什么意思? 别名为 @site3 的站点位于远程服务器上的文件夹 drupal_folder3 中,并且该 URI 在远程服务器上指向它。 这是可以预料的。 此外,您必须指定远程主机(即远程主机的 IP 地址)。 鉴于您已经设置了 SSH 密钥,您将不需要输入密码,除非您当然有一个密码来保护您的私有 SSH 密钥本身,如果您在两个远程主机(不是您的个人计算机)之间创建密钥,我建议您这样做)。
就是这样。 现在,当您运行我们一直在讨论的命令时,您可以远程执行相同的操作,以及迁移和保持站点同步。 但只是为了测试别名,运行:
drush @site3 status
这将比您在本地工作需要更长的时间,但它应该可以很好地工作。