温馨提示×

LNMP在Ubuntu上如何设置自动备份

小樊
35
2026-01-02 21:16:50
栏目: 智能运维

在 Ubuntu 上为 LNMP 配置自动备份

一 准备与原则

  • 备份范围建议覆盖:MySQL/MariaDB 数据库网站根目录Nginx 配置SSL 证书、以及可选的 PHP 配置
  • 保留策略建议:至少保留7 天,可按需调整为 14/30 天
  • 存储与隔离:为备份单独准备目录(如 /backup),并设置合适权限(如 700),避免被 Web 直接访问。
  • 自动化与观测:使用 cron 定时;脚本内记录日志;必要时将日志接入 rsyslog 便于审计与排错。

二 安装与准备

  • 安装必要工具(如未安装):
    • sudo apt-get update
    • sudo apt-get install -y mysql-client cron rsync gzip
  • 创建备份目录并设置权限:
    • sudo mkdir -p /backup/mysql /backup/nginx /backup/www /backup/ssl
    • sudo chmod 700 /backup /backup/*
  • 准备凭据文件(推荐方式,避免把密码写在命令行):
    • 创建 ~/.my.cnf
      • [client]
      • user=你的数据库用户
      • password=你的数据库密码
    • chmod 600 ~/.my.cnf
  • 确认 cron 服务运行:
    • sudo service cron status 或 sudo systemctl status cron
    • 如需日志:sudo apt-get install -y rsyslog && sudo sed -i ‘s/^#cron/cron/’ /etc/rsyslog.d/50-default.conf && sudo systemctl restart rsyslog

三 备份脚本示例

  • 目标:一次执行完成数据库、网站文件、Nginx 配置、SSL 证书的备份,并自动清理 7 天前的旧备份。
  • 建议将脚本保存为 /usr/local/bin/lnmp_backup.sh,并 chmod +x
#!/usr/bin/env bash
set -Eeuo pipefail

# 配置区
BACKUP_ROOT="/backup"
MYSQL_OPTS="--single-transaction --routines --triggers --hex-blob --set-gtid-purged=OFF"
RETENTION_DAYS=7

DATE=$(date +"%Y%m%d%H%M%S")
LOG_FILE="$BACKUP_ROOT/backup_$DATE.log"

# 目录
mkdir -p "$BACKUP_ROOT/mysql" "$BACKUP_ROOT/www" "$BACKUP_ROOT/nginx" "$BACKUP_ROOT/ssl"

log() { echo "[$(date '+%F %T')] $*" | tee -a "$LOG_FILE"; }

# 1) MySQL
DB_LIST=$(mysql -sN -e "SHOW DATABASES;" | grep -Ev "^(information_schema|performance_schema|mysql|sys)$" || true)
if [[ -n "$DB_LIST" ]]; then
  for DB in $DB_LIST; do
    mysqldump $MYSQL_OPTS -u"$(grep -E '^user=' ~/.my.cnf | cut -d= -f2)" "$DB" \
      | gzip > "$BACKUP_ROOT/mysql/${DB}_${DATE}.sql.gz"
    log "MySQL 备份完成: ${DB}_${DATE}.sql.gz"
  done
else
  log "未找到需要备份的数据库。"
fi

# 2) 网站文件
WEBSITE_ROOT="/var/www/html"
if [[ -d "$WEBSITE_ROOT" ]]; then
  tar czf "$BACKUP_ROOT/www/www_${DATE}.tar.gz" -C "$WEBSITE_ROOT" .
  log "网站文件备份完成: www_${DATE}.tar.gz"
fi

# 3) Nginx 配置
if [[ -d /etc/nginx ]]; then
  tar czf "$BACKUP_ROOT/nginx/nginx_${DATE}.tar.gz" -C /etc/nginx .
  log "Nginx 配置备份完成: nginx_${DATE}.tar.gz"
fi

# 4) SSL 证书
if [[ -d /etc/letsencrypt/live ]]; then
  tar czf "$BACKUP_ROOT/ssl/letsencrypt_${DATE}.tar.gz" -C /etc/letsencrypt/live .
  log "SSL 证书备份完成: letsencrypt_${DATE}.tar.gz"
fi

# 5) 清理旧备份
find "$BACKUP_ROOT/mysql" -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete
find "$BACKUP_ROOT/www"  -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete
find "$BACKUP_ROOT/nginx" -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete
find "$BACKUP_ROOT/ssl"   -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete
log "已清理 $RETENTION_DAYS 天前的旧备份。"

exit 0
  • 说明:
    • 使用 ~/.my.cnf 提供凭据,避免命令行暴露密码。
    • 排除系统库(information_schema、performance_schema、mysql、sys),可按需调整。
    • 备份完成后自动删除 7 天前的旧文件。

四 配置定时任务

  • 添加每日定时(如每天 01:00 执行):
    • crontab -e
    • 0 1 * * * /usr/local/bin/lnmp_backup.sh
  • 如需记录 cron 自身输出(可选):
    • 0 1 * * * /usr/local/bin/lnmp_backup.sh >> /var/log/lnmp_backup_cron.log 2>&1
  • 常用时间示例:
    • 每 5 分钟:*/5 * * * *
    • 每天 02:30:30 2 * * *
    • 每周日 03:00:0 3 * * 0
  • 查看与验证:
    • crontab -l
    • 查看日志:tail -f /var/log/syslog | grep CRON 或 tail -f /var/log/cron.log(若已启用 rsyslog)

五 远程备份与恢复演练

  • 远程备份(二选一或同时):
    • 使用 rsync 同步到远程主机(需 SSH 免密或密钥):
      • rsync -avz --delete -e ssh /backup/ user@remote:/backup/
    • 使用 scp 拷贝压缩包(适合偶发拉取):
      • scp /backup/mysql/*.sql.gz user@remote:/backup/mysql/
  • 恢复要点(示例):
    • MySQL:gunzip < db_20250102.sql.gz | mysql -u用户 -p 数据库名
    • 网站文件:tar xzf www_20250102.tar.gz -C /var/www/html
    • Nginx 配置:tar xzf nginx_20250102.tar.gz -C /etc/nginx && sudo nginx -t && sudo systemctl reload nginx
    • SSL 证书:tar xzf letsencrypt_20250102.tar.gz -C /etc/letsencrypt/live
  • 建议每周做一次恢复演练,验证备份可用与流程正确。

0