插件窝 干货文章 nginx日志定时备份和删除怎么配置

nginx日志定时备份和删除怎么配置

Nginx 日志 logrotate 备份 110    来源:    2025-04-21

Nginx日志定时备份与删除配置方案

方案概述

要实现Nginx日志的定时备份和删除,可以通过Linux系统的logrotate工具结合cron定时任务来实现。以下是详细配置步骤:

方法一:使用logrotate工具(推荐)

1. 创建logrotate配置文件

/etc/logrotate.d/目录下创建nginx配置文件:

sudo vim /etc/logrotate.d/nginx

添加以下内容(根据实际需求调整):

/var/log/nginx/*.log {
    daily                      # 每天轮转
    missingok                  # 如果日志文件不存在,不报错
    rotate 30                  # 保留30天的日志
    compress                   # 压缩旧日志
    delaycompress              # 延迟压缩(压缩前一天的日志)
    notifempty                 # 如果日志为空,不轮转
    create 0640 nginx adm      # 新日志文件权限和所有者
    sharedscripts              # 共享脚本
    postrotate
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 `cat /var/run/nginx.pid`  # 通知nginx重新打开日志文件
        fi
    endscript
}

2. 测试配置

sudo logrotate -d /etc/logrotate.d/nginx  # 测试配置(不实际执行)
sudo logrotate -f /etc/logrotate.d/nginx  # 强制执行一次

方法二:使用crontab脚本

1. 创建备份脚本

sudo vim /usr/local/bin/nginx_log_backup.sh

添加以下内容:

#!/bin/bash

# 定义变量
LOG_DIR="/var/log/nginx"
BACKUP_DIR="/var/log/nginx/backups"
DATE=$(date +%Y%m%d)

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

# 备份日志文件
for logfile in $LOG_DIR/*.log; do
    if [ -f "$logfile" ]; then
        gzip -c $logfile > $BACKUP_DIR/$(basename $logfile).$DATE.gz
        cat /dev/null > $logfile  # 清空原日志文件
    fi
done

# 删除30天前的备份
find $BACKUP_DIR -name "*.gz" -mtime +30 -exec rm -f {} \;

# 重新加载nginx日志
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)

2. 设置脚本权限

sudo chmod +x /usr/local/bin/nginx_log_backup.sh

3. 添加cron定时任务

sudo crontab -e

添加以下内容(每天凌晨1点执行):

0 1 * * * /usr/local/bin/nginx_log_backup.sh

注意事项

  1. 确保备份目录有足够的磁盘空间
  2. 根据实际需求调整保留天数(rotate或-mtime参数)
  3. 对于高流量网站,可能需要更频繁的日志轮转
  4. 测试时可以先手动执行脚本,确认无误后再设置定时任务
  5. 如果使用Docker部署的Nginx,需要调整日志路径和重载方式

验证配置

  • 检查cron是否正常运行:grep CRON /var/log/syslog
  • 检查logrotate日志:cat /var/lib/logrotate/status
  • 检查备份目录:ls -lh /var/log/nginx/backups

以上配置可以根据实际环境进行调整,确保日志管理既满足需求又不会占用过多存储空间。