温馨提示×

nginx日志如何备份

小樊
37
2026-08-02 18:37:21
栏目: 编程语言

Nginx 日志备份的核心思路是:定期切割 + 压缩归档 + 防止日志丢失。下面按“常用做法 → 自动化 → 注意事项”来说明。


一、最常用做法(推荐):logrotate

1️⃣ 为什么用 logrotate

  • Linux 自带
  • 支持按天 / 大小切割
  • 自动 reload nginx(不丢日志)
  • 可压缩、可保留历史

2️⃣ 示例配置(最常见)

sudo 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
}

3️⃣ 含义说明

参数 说明
daily 每天切割
rotate 30 保留 30 天
compress 压缩旧日志
delaycompress 下次再压缩(避免 reload 时日志被锁)
postrotate 切割后 reload nginx

4️⃣ 手动测试

logrotate -vf /etc/logrotate.d/nginx

二、手动备份(不推荐长期使用)

1️⃣ 备份 access.log

cp /var/log/nginx/access.log /backup/nginx/access_$(date +%F).log
> /var/log/nginx/access.log

⚠️ 问题

  • 直接清空可能丢日志
  • 不 reload nginx 会导致日志继续写旧 fd

✅ 正确方式:

mv access.log access.log.2026-01-21
kill -USR1 $(cat /var/run/nginx.pid)

三、自动定时备份(cron)

1️⃣ 脚本示例

#!/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

2️⃣ 加入 cron

crontab -e
0 0 * * * /usr/local/bin/nginx_log_backup.sh

四、Docker 中的 Nginx 日志备份

1️⃣ 挂载日志目录

volumes:
  - ./logs:/var/log/nginx

2️⃣ 在宿主机做 logrotate

/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

如果你愿意,我可以:

  • ✅ 帮你写 完整 logrotate 配置
  • ✅ 针对 高并发 / 大日志量 给优化方案
  • ✅ 给你 ELK / 日志采集 的替代方案

直接告诉我你的环境(系统 / nginx 是否 Docker / 日志大小)即可。

0