Nginx 日志每日切割与归档需三步:重命名当日日志、用 kill -USR1 通知 Nginx 重新打开日志、压缩昨日日志;须确认日志路径与 Nginx 工作用户权限,脚本用绝对路径并设于 crontab 每日 00:01 执行。

用 Shell 脚本配合 cron 实现 Nginx 日志的每日切割与归档,核心是三步:重命名当天日志、向 Nginx 发送信号重新打开日志文件、对旧日志做压缩归档。关键在于确保 Nginx 能正确重建日志文件,避免写入中断。
确认 Nginx 日志路径与用户权限
先查清 Nginx 配置中 access_log 和 error_log 的真实路径(通常在 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/*.conf 中),例如:
access_log /var/log/nginx/access.log;
同时确认运行 Nginx worker 进程的用户(如 www-data、nginx 或 root),脚本需以该用户身份或具备相应权限执行,否则无法向 Nginx 主进程发信号,也无法读写日志目录。
编写切割脚本(例如 save as /usr/local/bin/nginx-log-rotate.sh)
脚本需包含日期标记、日志移动、信号触发、压缩清理逻辑:
- 使用 date -d 'yesterday' +%Y%m%d 获取昨日日期,用于归档命名
- 将 /var/log/nginx/access.log 移为 /var/log/nginx/access_20240520.log
- 用 kill -USR1 $(cat /var/run/nginx.pid) 通知 Nginx 重新打开日志(不是 reload,不中断服务)
- 对昨日日志执行 gzip /var/log/nginx/access_20240520.log 压缩,节省空间
- 可选:用 find /var/log/nginx -name "access_*.log.gz" -mtime +30 -delete 清理 30 天前归档
设置定时任务(crontab)
建议在每天 00:01 执行(避开整点高并发):
1 0 * * * /bin/bash /usr/local/bin/nginx-log-rotate.sh >/dev/null 2>&1
注意:crontab 中 PATH 有限,务必用绝对路径调用 bash、date、kill、gzip 等命令;若脚本依赖环境变量(如 LANG),应在脚本开头显式声明。
验证与调试要点
首次运行前手动执行脚本一次,检查:
- 新日志文件是否生成(/var/log/nginx/access.log 是否为空且可写)
- 昨日日志是否已重命名并压缩(如 access_20240520.log.gz)
- Nginx 进程未重启(ps aux | grep nginx 查看主进程 PID 是否变化)
- 访问网站后新日志是否有新增记录(tail -f /var/log/nginx/access.log)
不复杂但容易忽略权限和信号类型 —— USR1 是关键,HUP 会 reload 配置,可能意外中断连接。


















