温馨提示×

CentOS nginx日志备份与恢复方法

小樊
53
2025-10-02 23:00:25
栏目: 智能运维

一、CentOS Nginx日志备份方法

1. 使用logrotate工具(系统自带,自动化推荐)

logrotate是Linux系统自带的日志管理工具,可定期轮转、压缩、删除Nginx日志,配置简单且支持自动化。
配置步骤

  • 编辑logrotate配置文件:sudo vim /etc/logrotate.d/nginx,添加以下内容(按需调整参数):
    /var/log/nginx/*.log {
        daily                # 每天轮转(可选:weekly/monthly)
        rotate 30            # 保留30份旧日志(可根据磁盘空间调整)
        compress             # 压缩旧日志(节省空间)
        delaycompress        # 延迟压缩(如第30份不压缩,减少IO)
        missingok            # 忽略缺失的日志文件(避免报错)
        notifempty           # 日志为空时不轮转
        create 0644 nginx nginx  # 轮转后创建新日志,权限644,属主nginx
        sharedscripts        # 所有日志处理完成后执行postrotate
        postrotate
            [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`  # 发送信号让Nginx重新打开日志文件
        endscript
    }
    
  • 测试配置有效性:sudo logrotate -d /etc/logrotate.d/nginx(模拟运行,查看是否有错误);
  • 手动触发轮转:sudo logrotate -f /etc/logrotate.d/nginx(强制立即执行);
  • 默认情况下,logrotate会通过系统cron(/etc/cron.daily/logrotate)每天自动执行。

2. 编写Shell脚本+crontab(灵活定制)

若需要更灵活的备份策略(如备份到远程服务器、按日期命名),可通过Shell脚本结合crontab实现。
脚本示例/usr/local/bin/nginx_log_backup.sh):

#!/bin/bash
# 定义变量
BACKUP_DIR="/backup/nginx/logs"  # 备份目录
LOG_DIR="/var/log/nginx"         # Nginx日志目录
DATE=$(date +%Y%m%d)             # 当前日期(格式:20250930)
TIMESTAMP=$(date +%Y%m%d%H%M)    # 完整时间戳(格式:202509301200)

# 创建备份目录
mkdir -p $BACKUP_DIR

# 备份access.log和error.log(压缩并重命名)
tar -czvf $BACKUP_DIR/access_$DATE.tar.gz $LOG_DIR/access.log
tar -czvf $BACKUP_DIR/error_$DATE.tar.gz $LOG_DIR/error.log

# 删除7天前的备份(保留近7天)
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -exec rm -f {} \;

# 可选:远程同步到备份服务器(需配置SSH免密)
# rsync -avz $BACKUP_DIR/ backupuser@192.168.1.100:/remote/backup/nginx/

设置crontab定时任务

  • 编辑root用户的crontab:sudo crontab -e,添加以下内容(每天凌晨2点执行):
    0 2 * * * /usr/local/bin/nginx_log_backup.sh >> /var/log/nginx_backup.log 2>&1
    
  • 赋予脚本执行权限:sudo chmod +x /usr/local/bin/nginx_log_backup.sh

3. 实时日志备份(可选,适合高可用场景)

若需要实时将日志传输到远程服务器(如ELK、S3),可使用Fluentd、Filebeat等日志采集工具。
以Filebeat为例

  • 安装Filebeat:sudo yum install filebeat -y
  • 配置Filebeat(/etc/filebeat/filebeat.yml):
    filebeat.inputs:
    - type: log
      enabled: true
      paths:
        - /var/log/nginx/access.log
        - /var/log/nginx/error.log
    output.logstash:
      hosts: ["logstash-server:5044"]  # 替换为Logstash服务器地址
    
  • 启动Filebeat:sudo systemctl start filebeat

二、CentOS Nginx日志恢复方法

1. 从备份中恢复(常规方法)

若日志已通过上述方法备份,可直接从备份文件中恢复:

  • 解压备份文件到原日志目录(以access_20250930.tar.gz为例):
    tar -xzvf /backup/nginx/logs/access_20250930.tar.gz -C /var/log/nginx/
    
  • 重启Nginx以重新打开日志文件(避免日志继续写入旧文件):
    sudo systemctl restart nginx
    
  • 验证恢复结果:tail -f /var/log/nginx/access.log

2. 使用lsof恢复误删除日志(紧急情况)

若日志文件被误删除(如rm -f /var/log/nginx/access.log),且Nginx进程仍在运行,可通过lsof工具恢复未释放的文件句柄。
操作步骤

  • 确认Nginx进程运行状态:systemctl status nginx(若未运行,先启动:systemctl start nginx);
  • 查找被删除的日志文件描述符:
    sudo lsof | grep /var/log/nginx/access.log | grep deleted
    
    输出示例:
    nginx  1439  root    5w   REG  253,0  1524  17117944 /var/log/nginx/access.log (deleted)
    
    (关键信息:进程ID1439,文件描述符5,文件大小1524字节);
  • 从/proc目录恢复文件内容:
    sudo cp /proc/1439/fd/5 /tmp/access.log.bak  # 复制到临时目录
    
  • 验证恢复的文件:head -n 5 /tmp/access.log.bak(查看前5行是否正常);
  • 重新创建日志文件并修复权限:
    sudo touch /var/log/nginx/access.log
    sudo chown nginx:nginx /var/log/nginx/access.log  # 确保属主为nginx用户
    
  • 让Nginx重新加载日志文件(不中断服务):
    sudo nginx -s reopen
    
  • 清理临时文件:rm -f /tmp/access.log.bak

3. 注意事项

  • 预防误删:可通过chattr +a命令设置日志文件为不可删除(仅root可修改):
    sudo chattr +a /var/log/nginx/access.log
    
    验证属性:lsattr /var/log/nginx/access.log(输出包含a标记);
  • 监控备份:定期检查备份目录的磁盘空间(df -h /backup)和备份文件的完整性(tar -tzvf backup.tar.gz);
  • 测试恢复:定期模拟恢复流程(如从备份中解压日志到临时目录,验证内容是否正确),确保备份有效。

0