在 Linux 下备份 Nginx 日志,常见做法有手动备份、脚本定时备份、结合 logrotate三种方式。下面按实用程度给你说明。
默认一般在:
/var/log/nginx/access.log
/var/log/nginx/error.log
如果你自定义过,查看:
nginx -T | grep log
cp /var/log/nginx/access.log /backup/nginx/access_$(date +%F).log
cp /var/log/nginx/error.log /backup/nginx/error_$(date +%F).log
mkdir -p /backup/nginx
vi /usr/local/bin/nginx_log_backup.sh
内容:
#!/bin/bash
DATE=$(date +%F)
LOG_DIR=/var/log/nginx
BACKUP_DIR=/backup/nginx
mkdir -p $BACKUP_DIR
cp $LOG_DIR/access.log $BACKUP_DIR/access_$DATE.log
cp $LOG_DIR/error.log $BACKUP_DIR/error_$DATE.log
# 可选:只保留 30 天
find $BACKUP_DIR -name "*.log" -mtime +30 -delete
chmod +x /usr/local/bin/nginx_log_backup.sh
crontab -e
添加:
0 0 * * * /usr/local/bin/nginx_log_backup.sh
Nginx 通常已集成 logrotate:
/etc/logrotate.d/nginx
示例配置:
/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
手动测试:
logrotate -d /etc/logrotate.d/nginx # 测试
logrotate -f /etc/logrotate.d/nginx # 强制执行
不要直接 rm 日志,否则 Nginx 可能继续写旧文件:
> /var/log/nginx/access.log
> /var/log/nginx/error.log
或发信号:
kill -USR1 $(cat /var/run/nginx.pid)
rsync -avz /backup/nginx/ user@backup-server:/data/nginx_logs/
如果你告诉我:
我可以给你更合适的备份方案。