Debian 上可落地的 Nginx 自动备份策略
一 备份范围与频率建议
二 自动化备份脚本与定时任务
#!/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/
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
三 日志轮转与清理
#!/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"
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
四 恢复流程与验证
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
五 安全与运维要点