LNMP如何实现自动备份功能
导读:LNMP自动备份实现方案 一 备份范围与准备 备份范围建议覆盖:MySQL/MariaDB 数据库、网站根目录(PHP 文件)、Nginx 配置、以及可选的 SSL 证书与其他关键配置。 准备与目录规划: 创建本地备份目录并设置安全权限...
LNMP自动备份实现方案
一 备份范围与准备
- 备份范围建议覆盖:MySQL/MariaDB 数据库、网站根目录(PHP 文件)、Nginx 配置、以及可选的 SSL 证书与其他关键配置。
- 准备与目录规划:
- 创建本地备份目录并设置安全权限,例如:/backup,建议权限为 700,仅 root 可访问。
- 安装必要工具:mysqldump、tar、gzip、rsync、cron(Debian/Ubuntu 可执行:sudo apt-get install rsync mysqldump cron)。
- 如采用远程备份,提前准备目标主机的 SSH 密钥登录或 FTP/SFTP 账号与目录。
二 一键脚本示例与说明
- 功能:全量备份数据库(可改为单库)、网站文件与 Nginx 配置;自动压缩;按保留天数清理;可选 SCP/Rsync 远程同步。
- 建议将脚本与备份目录置于 root 权限下运行,避免泄露数据库口令。
#!/usr/bin/env bash
set -Eeuo pipefail
# ========== 用户可配置 ==========
BACKUP_DIR="/backup" # 本地备份目录
MYSQL_USER="root" # 数据库用户
MYSQL_PASS="YourStrongPass!" # 数据库密码(生产建议用 ~/.my.cnf)
DB_NAME="--all-databases" # 备份全部库;如单库:DB_NAME="your_db"
NGINX_CONF="/etc/nginx" # Nginx 配置目录
WEBSITE_ROOT="/var/www/html" # 网站根目录
RETENTION_DAYS=7 # 保留天数
REMOTE_USER="backup" # 远程备份用户(可选)
REMOTE_HOST="192.0.2.10" # 远程主机(可选)
REMOTE_DIR="/remote/backup" # 远程备份目录(可选)
USE_SSH=true # true: SCP/RSYNC;false: 禁用远程
# ========== 初始化 ==========
DATE=$(date +"%Y%m%d%H%M%S")
mkdir -p "$BACKUP_DIR"
# 日志函数
log() {
echo "[$(date '+%F %T')] $*";
}
# ========== 备份 MySQL ==========
log "开始备份 MySQL ..."
MYSQL_FILE="$BACKUP_DIR/mysql_${
DATE}
.sql.gz"
mysqldump -u"$MYSQL_USER" -p"$MYSQL_PASS" $DB_NAME \
--single-transaction --routines --triggers --hex-blob \
| gzip >
"$MYSQL_FILE"
[[ $? -eq 0 ]] &
&
log "MySQL 备份完成: $MYSQL_FILE" \
|| {
log "MySQL 备份失败";
exit 1;
}
# ========== 备份网站文件 ==========
log "开始备份网站文件 ..."
WEB_FILE="$BACKUP_DIR/www_${
DATE}
.tar.gz"
tar -czf "$WEB_FILE" -C "$WEBSITE_ROOT" .
[[ $? -eq 0 ]] &
&
log "网站文件备份完成: $WEB_FILE" \
|| {
log "网站文件备份失败";
exit 1;
}
# ========== 备份 Nginx 配置 ==========
log "开始备份 Nginx 配置 ..."
NGINX_FILE="$BACKUP_DIR/nginx_${
DATE}
.tar.gz"
tar -czf "$NGINX_FILE" -C "$(dirname "$NGINX_CONF")" "$(basename "$NGINX_CONF")"
[[ $? -eq 0 ]] &
&
log "Nginx 配置备份完成: $NGINX_FILE" \
|| {
log "Nginx 配置备份失败";
exit 1;
}
# ========== 远程备份(可选) ==========
if [[ "$USE_SSH" == "true" ]];
then
log "开始同步到远程 $REMOTE_HOST:$REMOTE_DIR ..."
rsync -avz --remove-source-files "$BACKUP_DIR/" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/" \
&
&
log "远程同步完成" \
|| log "远程同步失败"
fi
# ========== 清理过期备份 ==========
log "清理 $RETENTION_DAYS 天前的备份 ..."
find "$BACKUP_DIR" -type f \( -name "*.sql.gz" -o -name "*.tar.gz" \) -mtime +$RETENTION_DAYS -delete
log "清理完成"
exit 0
- 安全建议:
- 避免在命令行直接写密码,生产环境推荐使用 ~/.my.cnf:
- 文件内容:
[mysqldump]
user=root
password=YourStrongPass! - 权限:chmod 600 ~/.my.cnf
- 脚本中调用:mysqldump --defaults-file=~/.my.cnf $DB_NAME …
- 文件内容:
- 远程传输优先 SSH 密钥,禁用口令登录。
- 避免在命令行直接写密码,生产环境推荐使用 ~/.my.cnf:
三 定时任务与远程备份
- 添加定时任务(root 执行):crontab -e
- 每天 02:00 执行全量备份:
0 2 * * * /usr/bin/bash /root/backup.sh > > /var/log/backup.log 2> & 1 - 每周日 03:00 仅备份数据库:
0 3 * * 0 /usr/bin/bash /root/backup.sh --db-only > > /var/log/backup.log 2> & 1
- 每天 02:00 执行全量备份:
- 远程备份方式:
- SCP:在脚本中使用 scp 将生成的压缩包复制到远程主机(适合一次性拷贝)。
- Rsync:如示例脚本所示,增量同步、可自动删除已同步的本地文件(–remove-source-files),便于节省本地空间。
四 校验与恢复演练
- 校验脚本:
- 手动执行一次:/root/backup.sh,检查 /backup 是否生成 .sql.gz 与 .tar.gz 文件,查看日志是否有报错。
- 校验压缩包:gunzip -t mysql_.sql.gz;tar -tzf www_.tar.gz。
- 恢复示例:
- 数据库:gunzip < mysql_20251118.sql.gz | mysql -u"$MYSQL_USER" -p"$MYSQL_PASS"
- 网站文件:tar -xzf www_20251118.tar.gz -C /var/www/html
- Nginx 配置:tar -xzf nginx_20251118.tar.gz -C /etc
五 进阶与可选方案
- 使用 LNMP 一键安装包自带的备份脚本:部分版本(如 lnmp1.6/tools/backup.sh)支持本地或 FTP 备份,可直接配置定时任务使用。
- 使用 宝塔面板:提供图形化的网站与数据库备份设置,支持定时与远程存储,适合不熟悉命令行的用户。
- 备份策略建议:
- 关键业务采用 每日全量 + 更频繁增量(如结合 rsync 增量),并保留 7–30 天;
- 定期做 恢复演练,验证备份可用性与完整性;
- 将备份目录与数据库、网站目录放在 不同磁盘/存储,降低单点故障风险。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: LNMP如何实现自动备份功能
本文地址: https://pptw.com/jishu/750450.html
