如何将WordPress站点备份到对象存储
介绍
DigitalOcean Spaces 可以为 WordPress 站点数据提供对象存储解决方案。 这些数据通常是多种多样的,包括媒体资产和数据库文件,使其成为对象存储的良好候选者。 由于 Spaces 等解决方案可以存储大量非结构化数据,因此它们可以容纳您网站的静态资产。 单独存储静态资产可以通过释放服务器上的空间和资源来优化站点性能。 如果您的站点具有动态资产——具有高请求率的资源或需要频繁修改的数据库文件——您可以考虑将块存储解决方案与您的 DigitalOcean Space 配对以优化存储您的数据。 要了解更多对象和块存储,请查看我们的对象存储对比教程 块存储服务 .
在本教程中,我们将使用 Spaces 来备份 WordPress 数据。 由于 DigitalOcean Spaces API 可与 AWS S3 API 互操作,我们将能够使用与 S3 兼容的插件来管理我们的备份,以及 S3cmd,一个用于工作的客户端工具与 S3 和 S3 兼容的对象存储。 我们将介绍几种创建备份的不同方法:使用 WordPress 插件、使用 S3cmd 创建手动备份,以及使用 S3cmd 和为此目的创建的脚本自动备份。
先决条件
本教程假设您在服务器上有一个 WordPress 实例以及一个 DigitalOcean Space。 如果没有,您可以设置以下内容:
- 一台 Ubuntu 16.04 服务器,按照我们的 Initial Server Setup with Ubuntu 16.04 教程 进行设置。
- 一个 LAMP 堆栈,按照我们关于 如何在 Ubuntu 16.04 上安装 Linux、Apache、MySQL、PHP (LAMP) 堆栈的教程安装在您的服务器上。
- WordPress,按照我们关于 如何在 Ubuntu 16.04 上使用 LAMP 安装 WordPress 的教程安装在您的服务器上。
- DigitalOcean Space 和 API 密钥,按照 如何创建 DigitalOcean Space 和 API 密钥 创建。
有了这些先决条件,我们就可以开始将 WordPress 网站备份到 Spaces。
修改 WordPress 权限
在本教程中,我们将使用 WordPress 项目中的 wp-content/uploads
文件夹,因此该文件夹存在并具有正确的权限非常重要。 您可以使用 mkdir
命令创建它,如果文件夹不存在,则使用 -p
标志创建文件夹,如果存在则避免引发错误:
sudo mkdir -p /var/www/html/wp-content/uploads
您现在可以设置文件夹的权限。 首先,将其所有权设置为您的用户(我们将在此处使用 sammy,但请务必使用您的非 root sudo
用户),并将所有权归为 www-data
团体:
sudo chown -R sammy:www-data /var/www/html/wp-content/uploads
接下来,建立将授予 Web 服务器对该文件夹的写入权限的权限:
sudo chmod -R g+w /var/www/html/wp-content/uploads
我们现在可以使用插件为 wp-content/uploads
文件夹中的资产创建备份,并从 WordPress 界面使用我们的资产。
使用插件创建备份
有多种 S3 兼容插件可用于将 WordPress 站点备份到空间。 评估插件时要考虑的一个因素是您是否要备份数据库文件,因为其中一些资源不提供该功能。 要记住的另一个因素是插件是否会从其他插件中提取资源。 例如,如果您使用的是文档管理器,您可能需要考虑您的备份插件是否会捕获由文档管理器在 wp-content/uploads
文件夹中创建的文件和资源。
使用 WP-CLI 安装插件
可以使用 WP-CLI 从命令行管理您的 WordPress 插件。 我们将在本节安装它,并在下一节中使用它来演示如何使用插件将 WordPress 数据备份到 Spaces。
要安装 WP-CLI,我们将遵循项目建议的步骤。 运行以下命令将二进制文件下载到您的 tmp
文件夹:
cd /tmp curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
要使该文件在命令行中可执行和可用,请键入以下内容:
chmod +x /tmp/wp-cli.phar
一旦我们使文件可执行,我们可以重命名它并将它移动到我们的 PATH
中的一个位置:
sudo mv /tmp/wp-cli.phar /usr/local/bin/wp
如果我们想检查我们的安装是否成功,我们可以运行以下命令:
wp --info
这将为我们提供有关我们正在使用的版本及其路径的一般信息。
我们现在可以使用 WP-CLI 安装我们希望使用的任何插件,并 管理与我们的 WordPress 站点相关的其他任务 。
安装和配置 UpdraftPlus 备份
如果您担心将数据库文件与其他媒体资产一起备份,那么您可能需要使用提供数据库备份选项的插件。 UpdraftPlus Backup 提供兼容 S3 的免费版本,支持数据库和媒体备份以及备份计划。
要安装 UpdraftPlus,我们可以导航到我们的 WordPress 插件目录:
cd /var/www/html/wp-content/plugins
从这里,我们可以使用 wp
命令安装 updraftplus
:
wp plugin install updraftplus
要激活插件,我们可以运行:
wp plugin activate updraftplus
从这里,我们可以导航到 WordPress 管理仪表板左侧的插件选项卡:
通过选择Installed Plugins,我们将到达一个列出我们已安装插件的页面。 我们应该在可用选项列表中看到 UpdraftPlus - Backup/Restore:
要配置备份设置,请导航到管理仪表板中的 Settings 选项卡,然后从可用选项列表中选择 UpdraftPlus Backups。 将有一个如下所示的登陆屏幕:
我们将介绍如何使用此插件进行基本站点备份。 在页面顶部的 设置 选项卡下,您将找到一个菜单,可让您安排备份:
如果您想测试插件是否有效,可以将此设置保留为 Manual。 我们现在将保留此设置以测试插件是否正常工作。
在此菜单下方,您将看到不同的远程存储选项。 选择 S3 兼容(通用):
选择此选项后,您将看到一个菜单,询问您的 DigitalOcean Space 信息:
根据您空间的 URL,您将能够确定其存储桶名称和端点。 例如,如果您的 Space 的 URL 是 https://example-name.nyc3.digitaloceanspaces.com
,那么 example-name
将是您的存储桶,而 nyc3.digitaloceanspaces.com
将是您的端点。 S3 位置 将是您的存储桶名称,S3 端点 将是您的端点。
在此下方,您将找到要在备份中包含和排除的文件的选项:
填写完这些设置以反映您要备份的内容后,您可以导航回 当前状态 选项卡。 当您从屏幕顶部的可用按钮中选择 立即备份 时,您将看到以下菜单:
在这里,您可以选择是否要备份您的数据库。
在此菜单底部选择 立即备份 选项后,您的备份文件应填充您的存储桶。 您可以导航到 DigitalOcean 控制面板中的 Spaces 页面以检查它们是否存在。 测试插件的功能后,您可以修改备份计划设置以满足您的需要。
使用 S3cmd 备份 WordPress
作为在对象存储解决方案中管理数据的命令行工具,S3cmd 提供了多种选项来将您的 WordPress 数据备份到 Spaces。 它可以用在独立的命令和自动化备份过程的脚本中。
如果您的服务器上尚未安装 s3cmd
,您可以按照 本教程的“安装 S3cmd” 部分 进行安装,然后按照 使用您的 Spaces 信息进行配置]“配置 S3cmd”部分。
您现在应该已安装 s3cmd
并使用您的空间信息进行配置。 您可以通过键入以下内容来验证 s3cmd
配置:
s3cmd --dump-config
您应该看到如下输出:
Output [default] access_key = Your_Spaces_Access_Key access_token = add_encoding_exts = add_headers = bucket_location = US ca_certs_file = cache_file = check_ssl_certificate = True check_ssl_hostname = True cloudfront_host = cloudfront.amazonaws.com default_mime_type = binary/octet-stream delay_updates = False delete_after = False delete_after_fetch = False delete_removed = False dry_run = False enable_multipart = True encrypt = False ...
一旦我们检查了我们的 s3cmd
配置信息以确保它与我们的 Spaces 凭据匹配,我们就可以使用 s3cmd
将文件备份到我们的 Space。 我们将首先手动执行此操作,然后再继续创建将自动执行此工作的脚本。
创建 wp-content/uploads
文件夹的手动备份
要创建我们的 wp-content/uploads
文件夹的备份,我们将使用一个名为 s3cmd sync
的命令。 这将允许我们仅传输那些在我们的空间中尚不存在的文件。 尽管这对于一次性传输可能并不重要,但随着您将更多数据移动到您的空间,它很快就会变得重要。 我们将使用 sammys-bucket 作为我们的存储桶,并使用 sammys-backups 在我们的空间上指定一个备份文件夹,但是您应该将这些替换为您的存储桶和备份文件夹的名称(如果适用)。 为了确保我们的文件能够到达预期的目的地,我们将 --dry-run
选项与 s3cmd
一起使用,如下所示:
s3cmd sync --dry-run /var/www/html/wp-content/uploads s3://sammys-bucket/sammys-backups/
如果命令的输出表明您的数据将到达其预期目的地,那么您可以继续运行不带 --dry-run
选项的命令:
s3cmd sync /var/www/html/wp-content/uploads s3://sammys-bucket/sammys-backups/
创建 MySQL 数据库的手动备份
我们现在可以创建 MySQL 数据库的手动备份。 这将分 4 个部分进行。 首先,我们可以在主目录中创建一个文件夹来保存我们的数据库文件:
mkdir ~/mysqldmp
接下来,我们将创建一个文件来保存我们的数据库用户和密码信息。 这将帮助我们避免在创建备份文件的过程中将该信息传递到命令行。 MySQL 的用户特定选项通常存储在 ~/.my.cnf
中,因此我们将在我们的主目录中创建该文件。 类型:
nano ~/.my.cnf
在文件中,我们将为 MySQL 客户端指定用户名和密码:
~/.my.cnf
[client] user=mysql_user password=mysql_password
通过键入 CTRL+X
后跟 Y
保存此文件。
要限制我们用户的读写权限,我们可以输入以下内容:
chmod 600 .my.cnf
现在我们将能够运行 mysqldump
命令来复制我们的数据库文件,而无需将密码信息传递到命令行。 当我们运行 mysqldump
时,它会查找我们的 .my.cnf
文件作为读取默认选项的过程的一部分。 要压缩我们数据库的输出,我们还可以使用 gzip
,如下所示:
mysqldump mysqldatabase_name | gzip > ~/mysqldmp/mysql_dump.sql.gz
最后,我们可以使用 s3cmd
将压缩文件发送到我们的 Space:
s3cmd sync mysqldmp/mysql_dump.sql.gz s3://sammys-bucket/sammys-backups/
您现在应该在您的空间中看到压缩的数据库文件。
使用 Cron 自动化 WordPress 备份
自动化备份将确保您的 WordPress 数据保持可访问和可恢复。 虽然可以手动创建备份,但这是一个耗时的过程,可以使用 cron
作业调度程序自动执行。 要了解有关使用 cron
安排任务的更多信息,请查看我们关于 如何在 VPS 上使用 Cron 和 Anacron 安排日常任务的教程。
要为我们的备份脚本创建文件,我们可以使用以下命令:
nano ~/wp-sync.sh
在空文件中,我们将首先编写以下内容以指示此脚本将由 Bash shell 运行:
wp-sync.sh
#!/bin/bash
接下来,我们将声明变量,这些变量将指定有关我们将备份哪些文件和数据库的信息。 我们的 DATABASE
和 UPLOADS_DIR
变量将指定有关我们将备份的数据库和文件夹的信息。 我们将这些变量声明为数组,这将允许我们指定多个值:
wp-sync.sh
... DATABASE=("mysqldatabase_name") # To add more than one database, separate values with spaces: ("database1" "database2") UPLOADS_DIR=("/var/www/html/wp-content/uploads") # To add more than one directory, separate values with spaces: ("folder1" "folder2") BACKUP_DIR=/home/sammy/mysqldmp
DATABASE
变量指定 mysqldump
将备份的 WordPress 数据库或数据库的名称。 UPLOADS_DIR
指向我们正在备份的一个或多个目录。 BACKUP_DIR
告诉脚本 mysqldump
应该在哪里写入备份文件。
接下来,我们将设置我们的 s3cmd
信息,包括我们的 Spaces 存储桶信息。 此信息将反映我们 s3cmd
配置文件中的 s3
存储桶信息。 当我们指定 S3_CMD
变量时,我们将包含 cron
的 s3cmd
二进制文件的路径。 我们还将包含一个 DATE
变量,它允许我们为备份文件创建时间戳:
wp-sync.sh
... DATE=$(date +%y%m%d-%H_%M_%S) S3_CMD="/usr/local/bin/s3cmd" S3_BUCKET=s3://sammys-bucket/sammys-backups/$DATE/
在这里,我们使 DATE
变量非常精细,以捕获年(%y
)、月(%m
)、日(%d
),我们备份的小时 (%H
)、分钟 (%M
) 和秒 (%S
)。 根据备份计划的频率,您可以对其进行修改,以便有效地跟踪备份。 我们的 S3_CMD
变量将指向允许我们运行命令的 s3cmd
可执行文件。
接下来,我们将包含一组命令,这些命令将创建我们的 mysqldmp
目录,以防它尚不存在,并在更新过程中从该目录中删除任何文件:
wp-sync.sh
... mkdir -p $BACKUP_DIR rm -rf "${BACKUP_DIR:?}/*"
最后,我们将创建 for loops 来为我们的数据库文件运行 s3cmd sync
。 我们将再次使用 mysqldump
创建一个压缩的数据库文件,但是我们将在其中添加 --defaults-extra-file
选项,它告诉 mysqldump
另外读取 .my.cnf
到标准选项文件。 我们还将遍历我们的数据库数组,对每个数据库执行相同的操作集:
wp-sync.sh
... for DB in "${DATABASE[@]}" do mysqldump --defaults-extra-file=/home/sammy/.my.cnf "$DB" | gzip > "$BACKUP_DIR/mysql_dump.sql.gz" $S3_CMD sync "$BACKUP_DIR/mysql_dump.sql.gz" "$S3_BUCKET" done
mysqldump
和 s3cmd sync
命令的作用与上一节相同。 但是,因为我们将 DATE
变量的时间戳添加到我们的存储桶中,我们的文件将在我们的空间中创建,以便我们轻松跟踪它们的创建时间。
接下来,我们将为目录创建一个循环。 同样,我们将遍历 UPLOADS_DIR
数组以对每个目录执行相同的操作:
wp-sync.sh
... for DIR in "${UPLOADS_DIR[@]}" do $S3_CMD sync "$DIR" "$S3_BUCKET" done
同样,s3cmd sync
命令与我们用来手动备份此目录的命令相同。 不同之处在于我们空间中附加到此材料的时间戳。
完整的脚本将如下所示:
wp-sync.sh
#!/bin/bash DATABASE=("mysqldatabase_name") # To add more than one database, separate values with spaces: ("database1" "database2") UPLOADS_DIR=("/var/www/html/wp-content/uploads") # To add more than one directory, separate values with spaces: ("folder1" "folder2") BACKUP_DIR=/home/sammy/mysqldmp DATE=$(date +%y%m%d-%H_%M_%S) S3_CMD="/usr/local/bin/s3cmd" S3_BUCKET=s3://sammys-bucket/sammys-backups/$DATE/ mkdir -p $BACKUP_DIR rm -rf "${BACKUP_DIR:?}/*" for DB in "${DATABASE[@]}" do mysqldump --defaults-extra-file=/home/sammy/.my.cnf "$DB" | gzip > "$BACKUP_DIR/mysql_dump.sql.gz" $S3_CMD sync "$BACKUP_DIR/mysql_dump.sql.gz" "$S3_BUCKET" done for DIR in "${UPLOADS_DIR[@]}" do $S3_CMD sync "$DIR" "$S3_BUCKET" done
我们现在可以使我们的 wp-sync.sh
脚本可执行:
chmod +x ~/wp-sync.sh
为了测试它,我们可以运行:
sudo ~/wp-sync.sh
导航到您的空间,并确保您的文件按预期复制。 选中此选项后,您可以编辑 crontab
文件以按所需的时间间隔运行脚本。
通过键入以下内容由 crontab
文件打开:
crontab -e
如果这是您第一次编辑此文件,您将被要求选择一个编辑器:
crontab
no crontab for root - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/ed 2. /bin/nano <---- easiest 3. /usr/bin/vim.basic 4. /usr/bin/vim.tiny Choose 1-4 [2]: ...
您可以为 nano 选择 2
,或输入您选择的编辑器对应的数字。
在文件的底部,我们将添加一行来指定我们的脚本应该多久运行一次。 为了测试我们脚本的功能,我们可以将时间间隔设置为两分钟,如下所示:
crontab
... */2 * * * * /home/sammy/wp-sync.sh
两分钟后,您应该会在您的空间中看到带有时间戳的文件存放。 您现在可以修改 crontab
文件以指定要用于备份的时间间隔。
结论
我们已经介绍了几种可以将 WordPress 数据备份到 DigitalOcean 的 Spaces 对象存储服务的方法。
要了解有关使用 s3cmd
和 Spaces 的更多信息,请查看我们的 配置 s3cmd 2x 以管理 DigitalOcean Spaces 的指南和我们关于 使用 s3cmd 管理 DigitalOcean Spaces 的教程。 您还可以查看我们关于 如何使用 DigitalOcean Spaces 自动备份和 如何将 Git 存储库备份到 DigitalOcean Spaces 的教程,了解更多自动化脚本和备份选项的示例。 最后,有关优化如何使用 Spaces 的更多信息,请查看 DigitalOcean Spaces 性能的最佳实践。