大概阅读时间20分钟
简介
在前面的文章我们搭建了LEMP堆栈的WordPress网站并能够使用多站点功能进一步扩展了我们的网站。但是,随着网站内容和用户数据的日增月累,定期备份和维护网站数据变得极为重要。备份数据不仅可以防止重要数据丢失,还能确保在遇到硬件故障、软件缺陷、安全攻击或其他意外情况时能够快速恢复网站运行,同时也是网站迁移、升级或进行重要变更的过程中不可或缺的一步。对网站数据定期备份能够确保网站能够长期稳定的运行,同时所有重要数据都能得到安全地保存以备不时之需。
关于WordPress网站的备份和维护的对象主要是以下几部分:
- MySQL数据库:存储了网站的所有数据,包括文章、评论、用户信息等,是网站最核心的部分。
- WordPress文件:包括所有的核心代码、主题、插件和上传的文件,是网站运行的基础。
- SSL证书:保证网站数据传输的安全,当你使用HTTPS时,证书对维护用户信任和建立网站信誉至关重要。
- iptables规则:保护服务器免受未授权访问和各种网络攻击,是服务器安全的重要组成部分。
- 系统和应用配置文件:这部分主要包括Web服务器(如Nginx或Apache)和PHP配置文件。这些配置决定了网站的运行行为和性能,对网站的稳定运行和安全性有直接影响。
通过对这些关键组件进行定期的备份和维护,可以确保我们WordPress网站的数据安全、稳定性和性能。接下来,我们将深入每个部分,介绍如何对这些组件进行具体的操作和维护步骤。
MySQL数据库备份
在维护任何网站或大型系统时,数据库备份是最关键的步骤之一。特别是对于像WordPress这样的内容管理系统,所有的内容数据都存储在MySQL数据库中。如果没有数据库备份的话,任何成都的数据损坏或丢失都可能导致重大的损失,这对网站运行和用户体验都是灾难性的。因此,定期备份MySQL数据库是确保数据安全和业务稳定性的必要措施之一。
使用mysqldump工具进行备份
-
SSH登录到服务器。
-
使用以下命令进行备份:
sudo mysqldump -u [用户名] -p [数据库名称] > [备份文件名称].sql
执行后需要输入你的MySQL用户密码,将相应部分替换为实际的用户名、数据库名称和希望的备份文件名。
-
完成备份后,确保检查.sql文件以确认数据已成功备份。
使用crontab定时备份
我们不必要每天花费时间去手动做一次备份,因为创建一个定时任务(cron job)将更加轻松,关于cron你需要了解一些基本概念,来合理的安排定时任务。简单来说他的结构如下:
* * * * * command to be executed
其中前面部分为执行时间设置
- 第一个*表示分钟(0 - 59)。
- 第二个*代表小时(0 - 23)。
- 第三个*代表一个月中的哪一天(1 - 31)。
- 第四个*代表月份(1 - 12)。
- 第五个*代表一个星期中的哪天(0 - 7),其中0和7都代表星期天。
接下来就是具体的设置步骤了:
- 打开终端,输入
crontab -e
使用当前用户或者使用rootsudo crontab -e
以编辑crontab。 - 在文件末尾,添加和前面类似的命令来进行自动备份。例如,每天凌晨2点执行备份(通常选择在业务较少的时段):
0 2 * * * sudo /usr/bin/mysqldump -u [用户名] -p[密码] [数据库名称] > /home/user/db_backup/[数据库名称]_$(date +\%Y\%m\%d).sql
通过这样的命令,我们就会把对应的数据库备份到
/home/user/db_backup/
目录下,需要注意密码是紧跟在 -p之后(没有空格),数据库备份的格式是 名称_当天的日期 这样的。 - 保存并关闭(和vim操作一致)之后,系统将自动应用新的定时任务,你可以先设置一个比较近的时间测试,测试功能正常后,再设置成你想要他执行的时间,如果变更比较少,要求不高的情况每天备份一次就可以了。
- 恢复数据库就比较简单了,在目标数据库创建相应的表并设置好权限后,使用`mysql -u [用户名] -p[密码] [数据库名称] 注意:
这种备份会明文显示你的数据库密码,如果需要提高安全性,可以使用脚本的方式来隐藏密码。后续我会写一篇关于使用bash脚本来完成这些操作的文章。
异地保存和管理备份文件
如果只是保存在服务器本地,其实仍然不够保险,毕竟如果服务器本身出现问题,数据还是会丢失。因此,我们还需要考虑异地保存和管理备份文件,比如云存储服务或者上传到另一台备份服务器,甚至下载到自己的PC上(如果不考虑信息安全的问题的话)。
MySQL实时增量备份简介
上面这种全量备份的方式可以作为简单的备份,MySQL也支持实时增量备份,这种备份方式可以记录自上次备份以来数据库的所有更改。这意味着你可以实现更准确的数据恢复,在出现异常时可以恢复到最新的一个时间,而定时任务只有截至到备份当时的数据。本文不深入讨论具体实现(因为我对数据库也不够专业 :P),因为要实现增量备份通常需要使用专门的工具,或者开启MySQL的二进制日志(binary logs),这样就会记录下数据库的变更,通过binlog将数据库恢复到最新的数据。
这里可以讲一下开启binlog的方法(至于如何恢复数据,待我学习研究以下再做更新了):
-
在MySQL的配置文件中(通常是
/etc/mysql/my.cnf
或者/etc/my.cnf
)添加以下配置:[mysqld] log_bin=mysql-bin server_id=1 max_binlog_size=100M #单个文件大小为100M expire_logs_days=7 #binlog保留时间为7天
-
重启MySQL服务:
sudo systemctl restart mysql
-
登录MySQL,验证是否已经启用:
SHOW BINARY LOGS;
如果二进制日志已启用,你将看到一个日志文件列表。
通过以上步骤,你的MySQL数据库备份工作应该已经顺利进行了。定期执行全量和增量备份是确保数据安全的关键一环。
WordPress文件备份
在维护WordPress网站时,定期备份网站文件是非常重要的。这不仅可以保护你的网站免受数据丢失、黑客攻击或更新异常等意外事件的影响,还可以在需要时,如网站迁移或升级,快速恢复网站的运行。WordPress文件包括核心代码、主题、插件和上传的媒体文件,这些内容维持着整个网站的运行。
通过tar打包备份WordPress文件
- 登录到你的服务器。
- 切换到WordPress的根目录,例如:
cd /var/www/blog.yourdomain.com
- 使用
tar
命令(通常自带了的)创建一个wordpress目录的压缩包:sudo tar -czvf wordpress_backup_$(date +%Y%m%d).tar.gz .
这条命令会将整个WordPress目录压缩成一个名格式为
wordpress_backup_当天日期.tar.gz
的文件。
使用crontab定时备份WordPress文件
定时备份可以通过设置下面的定时任务来实现:
- 和之前一样,编辑crontab。
- 在文件末尾,添加一行来设置你的自动备份任务。例如,每天凌晨3点备份WordPress文件(合理设置你的备份时间,不要让几个备份任务同时进行,以免影响性能或造成备份失败):
0 3 * * 0 sudo tar -czvf /home/user/wp_backup/wordpress_backup_$(date +\%Y\%m\%d).tar.gz -C /var/www/blog.yourdomain.com .
忘了提醒一点,包括前面mysql备份,都需要先确保指定的备份目录存在,如果不存在需要先
mkdir /home/user/xx_backup
创建目录。 - 如果需要恢复WordPress文件,只需将备份文件解压到WordPress的根目录即可:
sudo tar -xzvf wordpress_backup_YYYYMMDD.tar.gz -C /var/www/blog.yourdomain.com/
备份文件的存储和管理
同样,不要把鸡蛋放在一个篮子里,最佳实践是将备份文件存储在本地服务器外的其他位置,这样才能保证在服务器异常的情况下备份文件仍然可用。
通过上述步骤,你应该已经有效地备份了你的WordPress文件,并通过定时任务和异地存储管理,确保网站数据的安全和异常容灾恢复能力。
使用Certbot进行SSL证书维护
SSL证书对于保护网站的安全至关重要,它们加密网站与用户之间的通信,保障数据传输的安全性。然而,SSL证书通常有一个有效期限,过期后将不再提供保护。因此,定期维护和更新SSL证书是保持网站安全性的重要部分。这部分内容在第一篇中已经介绍过,这里再具体讲一遍。
- 验证自动续订:
Certbot 安装后,会自动设置一个定时任务以定期检查和续订证书。你可以通过执行以下命令来测试自动续订过程:sudo certbot renew --dry-run
设置systemctl timer进行自动续订
Certbot 安装时通常会自动设置一个systemd定时器来管理证书的自动续订。你可以使用以下命令查看定时器的状态:
sudo systemctl list-timers | grep certbot
sudo systemctl status certbot.timer
如果这个定时器被激活,它会定期执行续订任务,通常是两次一天,你不需要进一步的设置,只需要验证是否能进行自动续订即可。
虽然他会一天检查两次,但是如果你的证书没有临近期限,他不会变更你的证书,所以不用担心。
如果这个定时器没有激活,你可以通过以下命令来激活它:
sudo systemctl start certbot.timer
sudo systemctl enable certbot.timer
手动设置cron job进行自动续订
如果timer无法设置或者更习惯使用cron job,你也可以设置cron job来处理自动续订,只需要按照以下步骤进行设置:
- 编辑crontab。
- 在文件末尾,添加一行以设置自动续订任务。例如需要每天凌晨1点检查并续订任何即将到期的证书:
0 1 * * * sudo certbot renew --quiet
--quiet
选项意味着只有在续订尝试失败或者成功续订变更新证书后,Certbot 才会输出信息。
验证自动续订
你可以通过执行以下命令来测试自动续订过程:
sudo certbot renew --dry-run
确保在运行Certbot之前,你的服务器的80端口是开放的同时注意服务器防火墙(ufw/iptables)允许80端口的访问,因为Let's Encrypt通常需要通过该端口验证服务器的所有权。
通过以上步骤,应该可以确保你的网站持续使用有效的SSL证书,从而保持网站的安全性和信任度。不过即使在设置了自动续订后,也需要定期检查你的续订任务日志或者查看邮箱是否有相关通知,确保续订一直能够正常进行。
iptables备份和开机加载
由于我之前使用iptables作为访问控制工具。因此,定期备份iptables规则以及在系统启动时自动加载这些规则也是确保系统安全的重要步骤。
如何备份iptables规则
- 登录到服务器。
- 使用以下命令将当前的iptables规则保存到一个文件中:
sudo iptables-save > /home/user/iptables.backup
这个命令将所有当前活动的iptables规则输出到指定的文件中,确保你在需要时能够快速恢复这些规则。
- 可以设置cron job来定期执行这个命令,以确保你的iptables规则备份文件保持最新:
0 0 * * * sudo iptables-save > /home/user/iptables_$(date +%Y%m%d).backup
如何恢复iptables规则
- 确保你有iptables规则的备份文件。
- 使用以下命令将这些规则恢复到iptables:
sudo iptables-restore < /home/user/iptables.backup
如果要使用某一天的备份则修改文件名为
iptables_YYYYMMDD.backup
。
使用systemd开机自动加载iptables
为了让iptables规则在Ubuntu20.04系统启动时自动加载,你可以将iptables-restore
命令添加到系统的启动脚本中:
-
创建Systemd的服务文件:
sudo vim /etc/systemd/system/iptables-load.service
-
在文件中添加以下内容:
[Unit] Description=IPTABLES RESTORE DefaultDependencies=no Before=network-pre.target Wants=network-pre.target
[Service]
Type=oneshot
ExecStart=/sbin/iptables-restore /home/user/iptables.backup
[Install]
WantedBy=multi-user.target
重新加载systemd配置并启动服务:
```bash
sudo systemctl daemon-reload
sudo systemctl enable iptables-load
sudo systemctl start iptables-load
- 如果你需要恢复最新的iptables备份,由于systemd不支持使用shell命令和变量,所以要使用动态的备份文件就需要通过脚本来完成了:
sudo vim /home/user/iptables-load.sh
添加以下内容:
#!/bin/bash
/sbin/iptables-restore < /home/user/iptables_$(date +%Y%m%d).backup
保存后退出,添加shell脚本执行权限:
sudo chmod +x /home/user/load-iptables.sh
修改/etc/systemd/system/iptables-load.service
文件,将ExecStart
的值修改为/home/user/load-iptables.sh
:
[Unit]
Description=Load iptables rules
Before=network-pre.target
Wants=network-pre.target
[Service]
Type=oneshot
ExecStart=/home/user/load-iptables.sh
[Install]
WantedBy=multi-user.target
同样需要重新加载systemd配置并启动服务:
sudo systemctl daemon-reload
sudo systemctl enable iptables-load
sudo systemctl start iptables-load
总结
定期备份和维护是保持你的WordPress网站运行平稳、安全不可或缺的措施。在当今时代,数据是极其宝贵的资源,尽管云服务能提供很高的可靠性,但是互联网环境仍然充满着不可预测性,因此,通过定期执行备份和维护任务,不仅可以让你能够确保数据的安全,还能在发生问题时迅速恢复服务,最小化自己的损失和对用户体验的影响。
这应该是关于WordPress的最后一篇文章,后续或许会写一些使用中的体验和经验分享。在这篇文章里,我们介绍了如何备份MySQL数据库、WordPress文件,如何使用Certbot自动维护SSL证书,以及如何备份和自动加载iptables规则。我想这些内容应该已经可以初步保障网站的长期稳定运行,希望这些内容可以帮助你搭建一个更加稳定和安全的网站环境。
参考资料:
https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html
https://dev.mysql.com/doc/refman/8.0/en/mysqlbinlog.html
https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units