一、CentOS Nginx日志备份方法
logrotate是Linux系统自带的日志管理工具,可定期轮转、压缩、删除Nginx日志,配置简单且支持自动化。
配置步骤:
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(强制立即执行);/etc/cron.daily/logrotate)每天自动执行。若需要更灵活的备份策略(如备份到远程服务器、按日期命名),可通过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定时任务:
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。若需要实时将日志传输到远程服务器(如ELK、S3),可使用Fluentd、Filebeat等日志采集工具。
以Filebeat为例:
sudo yum install filebeat -y;/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服务器地址
sudo systemctl start filebeat。二、CentOS Nginx日志恢复方法
若日志已通过上述方法备份,可直接从备份文件中恢复:
access_20250930.tar.gz为例):tar -xzvf /backup/nginx/logs/access_20250930.tar.gz -C /var/log/nginx/
sudo systemctl restart nginx
tail -f /var/log/nginx/access.log。若日志文件被误删除(如rm -f /var/log/nginx/access.log),且Nginx进程仍在运行,可通过lsof工具恢复未释放的文件句柄。
操作步骤:
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字节);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用户
sudo nginx -s reopen
rm -f /tmp/access.log.bak。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);