温馨提示×

Debian Nginx自动备份策略

小樊
35
2025-12-27 16:36:46
栏目: 智能运维

Debian 上可落地的 Nginx 自动备份策略


一 备份范围与频率建议

  • 配置与站点:备份 /etc/nginx/ 下的全部配置(如 nginx.conf、conf.d/、sites-available/ 等),建议每日备份并保留7–30 天
  • 网站文件:备份 /var/www/ 或实际 root 目录,建议每日备份并保留7–30 天
  • SSL 证书:备份 /etc/ssl//etc/letsencrypt/,建议每日备份并保留90 天以上(证书续期频繁)。
  • 数据库:如部署了 MySQL/MariaDB/PostgreSQL,建议每日备份并保留7–30 天
  • 日志:不建议把运行日志纳入常规配置备份;采用**按日切割 + 压缩 + 定期清理(如保留 30 天)**的策略,避免备份体积膨胀。

二 自动化备份脚本与定时任务

  • 全量备份脚本(配置 + 站点 + 证书 + 可选数据库),保留最近 7 天
#!/usr/bin/env bash
set -Eeuo pipefail

# 配置
BACKUP_DIR="/var/backups/nginx"
DATE=$(date +"%Y%m%d%H%M%S")
KEEP_DAYS=7

# 创建目录
mkdir -p "$BACKUP_DIR"

# 备份 Nginx 配置
tar -czf "$BACKUP_DIR/nginx_conf_$DATE.tar.gz" -C / etc/nginx

# 备份网站文件(按实际 root 调整)
tar -czf "$BACKUP_DIR/www_$DATE.tar.gz" -C / var/www

# 备份证书(两种常见路径,按实际启用其一)
if [[ -d /etc/letsencrypt ]]; then
  tar -czf "$BACKUP_DIR/letsencrypt_$DATE.tar.gz" -C / etc/letsencrypt
elif [[ -d /etc/ssl ]]; then
  tar -czf "$BACKUP_DIR/ssl_$DATE.tar.gz" -C / etc/ssl
fi

# 可选:备份数据库(示例为 MySQL,按需启用)
# mysqldump -u root -p"$DB_PASS" --single-transaction --routines --triggers --databases your_db > "$BACKUP_DIR/db_$DATE.sql"
# gzip "$BACKUP_DIR/db_$DATE.sql"

# 清理旧备份
find "$BACKUP_DIR" -type f -name "*.tar.gz" -mtime +$KEEP_DAYS -delete

# 可选:上传到远程存储(示例 rsync)
# rsync -avz --delete "$BACKUP_DIR/" backup@backup.example.com:/backups/nginx/
  • 赋予执行权限并加入定时任务(每天 02:00 执行):
chmod +x /usr/local/bin/nginx_backup.sh
sudo crontab -e
# 添加:
0 2 * * * /usr/local/bin/nginx_backup.sh >> /var/log/nginx_backup.log 2>&1
  • 说明:如希望减少体积,可将打包方式改为 增量备份(rsync),仅同步自上次以来变更的文件。

三 日志轮转与清理

  • 推荐优先使用系统自带的 logrotate 管理 Nginx 日志(避免与自定义脚本冲突)。
  • 如需自定义按日切割、压缩并保留 30 天 的脚本,可参考:
#!/usr/bin/env bash
LOG_DIR="/var/log/nginx"
DAYS_TO_KEEP=30
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)

# 切割
[[ -f "$LOG_DIR/access.log" ]] && mv "$LOG_DIR/access.log" "$LOG_DIR/access_$YESTERDAY.log"
[[ -f "$LOG_DIR/error.log" ]]  && mv "$LOG_DIR/error.log"  "$LOG_DIR/error_$YESTERDAY.log"

# 通知 Nginx 重新打开日志文件
if [[ -f /var/run/nginx.pid ]]; then
  kill -USR1 "$(cat /var/run/nginx.pid)"
fi

# 压缩
gzip -f "$LOG_DIR/access_$YESTERDAY.log"
gzip -f "$LOG_DIR/error_$YESTERDAY.log"

# 清理
find "$LOG_DIR" -type f -name "access_*.log.gz" -mtime +$DAYS_TO_KEEP -delete
find "$LOG_DIR" -type f -name "error_*.log.gz"  -mtime +$DAYS_TO_KEEP -delete

echo "$(date '+%F %T') 日志切割、压缩与清理完成。" >> "$LOG_DIR/nginx_log_cleanup.log"
  • 加入定时任务(每天 00:00 执行):
sudo chmod +x /usr/local/bin/rotate_compress_clean_nginx_logs.sh
sudo crontab -e
# 添加:
0 0 * * * /usr/local/bin/rotate_compress_clean_nginx_logs.sh
  • 要点:切割后必须向 Nginx 主进程发送 USR1 信号,使其重新打开日志文件,避免继续写入已重命名的旧文件。

四 恢复流程与验证

  • 恢复配置(建议先停服务,恢复后做语法检查再启动):
sudo systemctl stop nginx
# 示例:恢复配置
sudo tar -xzvf /var/backups/nginx/nginx_conf_YYYYMMDDHHMMSS.tar.gz -C /
# 语法检查
sudo nginx -t
sudo systemctl start nginx
  • 恢复网站文件与证书:
sudo tar -xzvf /var/backups/nginx/www_YYYYMMDDHHMMSS.tar.gz -C /
sudo tar -xzvf /var/backups/nginx/letsencrypt_YYYYMMDDHHMMSS.tar.gz -C /  # 或 ssl_*.tar.gz
  • 恢复数据库(如启用):
gunzip < /var/backups/nginx/db_YYYYMMDDHHMMSS.sql.gz | mysql -u root -p
# 或 psql -U postgres < db_YYYYMMDDHHMMSS.sql
  • 验证要点:检查站点可访问、证书有效、关键页面与接口返回正常、数据库记录一致。

五 安全与运维要点

  • 备份目录与脚本权限:仅允许 root 读写执行;备份文件含敏感信息(如私钥、数据库凭据),注意传输与存储加密
  • 异地与多副本:定期将备份同步到远程主机或对象存储,避免单点故障。
  • 保留策略:配置与证书保留期应长于网站文件与数据库;日志压缩后保留 30 天 通常足够。
  • 监控与告警:记录脚本输出日志(如 /var/log/nginx_backup.log),对备份失败、磁盘空间不足设置告警。
  • 避免重复轮转:若已启用 logrotate,不要再用自定义脚本对同一日志做轮转,以免冲突。

0