如何使用 Drush 迁移和同步 Drupal 网站
介绍
如果您认为 Drush 在快速安装和更新 Drupal 模块方面非常出色,那么您应该看到它在迁移网站或保持多个网站同步方面的作用。如果您不知道 Drush 是什么,您可以阅读此入门教程,它将帮助您进行设置。如果您想了解如何使用一些基本的 Drush 命令,您还可以阅读此教程,它可以帮助您快速上手。
在本教程中,您将学习如何使用 Drush 更有效地将网站从一个 VPS 迁移到另一个 VPS,管理多个网站并轻松在它们之间同步。本教程假设您正在运行自己的云服务器,上面有 Drush,并且已经安装了 Drupal 网站。
Drush 别名
使用 Drush 执行操作时,通常您必须在 Drupal 文件夹中键入命令。当只需处理一个 Drupal 安装时,这不是问题。但有些情况下,我们将在本教程中看到,您需要管理多个站点。幸运的是,Drush 有一个很棒的功能,称为别名。
Drush 别名是一组简单的配置,允许您使用以下格式的快捷方式@site从服务器文件夹结构中的任何位置引用 Drupal 站点。 不过,在使用这些快捷方式之前,您需要配置相应的别名。 为此,如果您还没有别名,请在服务器根文件夹中的.drush文件夹中创建一个名为aliases.drushrc.php的文件:
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 地址。您应该将其替换为您的 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。
- 您可以在本教程中了解如何快速设置 Drush
- 您可以在本教程中了解如何快速设置 SSH 密钥
完成这些步骤后,让我们看看如何配置别名以便进行远程连接。像往常一样,打开并编辑第一台服务器(您之前一直在使用的服务器)上的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
与本地工作相比,这会花费更长的时间,但它应该可以很好地工作。