Nginx 日志备份的核心思路是:定期切割 + 压缩归档 + 防止日志丢失。下面按“常用做法 → 自动化 → 注意事项”来说明。
logrotatesudo vim /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
rotate 30
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
systemctl reload nginx > /dev/null 2>&1
endscript
}
| 参数 | 说明 |
|---|---|
| daily | 每天切割 |
| rotate 30 | 保留 30 天 |
| compress | 压缩旧日志 |
| delaycompress | 下次再压缩(避免 reload 时日志被锁) |
| postrotate | 切割后 reload nginx |
logrotate -vf /etc/logrotate.d/nginx
cp /var/log/nginx/access.log /backup/nginx/access_$(date +%F).log
> /var/log/nginx/access.log
⚠️ 问题:
✅ 正确方式:
mv access.log access.log.2026-01-21
kill -USR1 $(cat /var/run/nginx.pid)
#!/bin/bash
DATE=$(date +%F)
BACKUP_DIR=/data/nginx_logs
mkdir -p $BACKUP_DIR
mv /var/log/nginx/access.log $BACKUP_DIR/access_$DATE.log
mv /var/log/nginx/error.log $BACKUP_DIR/error_$DATE.log
kill -USR1 $(cat /var/run/nginx.pid)
gzip $BACKUP_DIR/*.log
crontab -e
0 0 * * * /usr/local/bin/nginx_log_backup.sh
volumes:
- ./logs:/var/log/nginx
/opt/nginx/logs/*.log {
daily
rotate 7
compress
copytruncate
}
⚠️ copytruncate 适合 Docker(不能 reload)
✅ 一定要 reload / USR1 nginx
✅ 不要直接用 rm / echo >
✅ 生产环境推荐
logrotate + systemctl reload nginx| 场景 | 推荐方案 |
|---|---|
| 物理机 / 虚拟机 | logrotate |
| 云服务器 | logrotate |
| Docker | 挂载 + logrotate |
| 临时备份 | mv + USR1 |
如果你愿意,我可以:
直接告诉我你的环境(系统 / nginx 是否 Docker / 日志大小)即可。