前因
目前有一个项目,在生产环境上跑,nginx的日志文件很大,造成磁盘空间的不足,需要清理日志文件,但是由于是生产环境,不能停服。查找了一下资料,记录一下在不停服的情况,备份nginx的日志。
备份access.log
nginx的日志是放在nginx/logs/access.log位置,这里先执行mv access.log access.log.bak,执行完发现并没有产生新的access.log文件,tail -f access.log.bak,发现日志还是不断在追加到备份文件上。
这里用的一个命令,kill -USR1 pid USR1亦通常被用来告知应用程序重载配置文件;例如,向Apache HTTP服务器发送一个USR1信号将导致以下步骤的发生:停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改。
执行kill -USR1 $(cat /usr/local/nginx/nginx.pid),发现logs会生产一个access.log,并且请求日志在不断追加到该文件。到了这一步备份基本完成了,access.log.bak可以执行某些操作了,删除、压缩、移动到其他服务器都可以操作了。
定时备份
编写一个备份脚本,定时执行该备份脚本,这里把脚本名称记为:back_nginx_log.sh,脚本内容如下
#!/bin/bash
D=$(date +%Y%m%d) #日期后缀
LOGS_PATH=/usr/local/nginx/logs #nginx日志文件位置
mv /usr/local/nginx/logs/access.log /${LOGS_PATH}/access_${D}.log #移动备份日志
kill -USR1 $(cat /usr/local/nginx/nginx.pid) #发送新号量,产生新的日志文件
定时执行该脚本,执行crontab -e,添加一个定时任务0 5 *** /root/back_nginx_log.sh
每天早上5点运行/root/back_nginx_log.sh脚本
crontab 文件的格式:{minute}{hour}{day-of-month}{month}{day-of-week}{full-path-to-shell-script}
minute:区间为0-59 hour:区间为0-23 day-of-mouth:区间为0-31 mouth:区间为1-12 1是1月 12是12月 。 day-of-week:区间为0-7,周日可以是0或7;