Nginx按天切分日志并自动备份到七牛云存储

2017-10-18

上篇文章中我曾讲到,数天前我将本站从阿里云的虚拟主机迁移到了ECS云主机上。在迁移过程中,我在安装Nginx服务器的时候遇到了一个非常典型的问题——如何将Nginx服务器的日志按日期进行切分?Nginx服务器的日志默认是存放在access_log.log和error.log两个文件中的。如果不对这两个文件进行切分处理,长此以往,这两个文件将变得非常巨大,以致影响数据的存储和分析,难以使用。所以,对这两个文件进行切分,尤其是按时间进行切分,还是非常有必要的。

其次,我国相关法律规定,“互联网信息服务提供者、互联网接入服务提供者应当记录日志信息,保存12个月”。出于网站的合规性考虑,我们需要将网站服务日志做较长时间的保留。可是ECS的自带磁盘无论是出于存储代价还是服务可靠性的考虑,都不适合这种持久性保存的应用场景,最好的处理方式还是将这些日志存放到专业的云存储服务中。鉴于七牛提供了10GB的免费存储空间和较为完善的命令行工具,而阿里云的OSS云存储多多少少仍需要付些费用,所以我最终还是决定采用七牛家的服务来做这件事情。那么,怎样才能将Nginx的日志增量备份到七牛云存储呢?

网络上关于Nginx日志按时间切分的文章很多,Google一搜一大把;而且,七牛也为Linux操作系统提供了现成的QSHELL上传工具。所以,只要对网络上的现有脚本稍加改造,便可以实现我们需要的功能。下面我简单介绍一下我是如何实现这两个功能的。

实现原理


本文的实现原理如下:

1)将access_log.log和error.log文件按当前时间重命名。
2)将重命名后的文件上传到七牛云存储。由于存储日志的文件夹中还有其他日志文件,所以我们要求是增量备份,即只备份当前文件。
3)为了避免日志占用过多本地过多的存储空间,我们要求将创建超过一定时间(比如30天)的日志从本地磁盘上删除。
4)Nginx服务器重新加载。
5)上述步骤可以在每天凌晨的0时0分自动执行(基于Linux的crontab定时任务)。

具体操作步骤


一、设置七牛命令行工具qshell

1、下载七牛的Linux命令行工具qshell(https://developer.qiniu.com/kodo/tools/1302/qshell#2),并存放在特定路径下,比如:/usr/local/qshell/。(注意:粘贴时请去掉”//”及之后的内容)

mkdir -p /usr/local/qshell/ && cd /usr/local/qshell/ //创建qshell的存储文件夹
wget -c https://dn-devtools.qbox.me/2.1.5/qshell-linux-x64?ref=developer.qiniu.com -O qshell-linux-x64 //以64位版本为例,其他版本请自行更改
chmod +x qshell-linux-x64 //增加可执行权限

2、在当前目录(/usr/local/qshell/)下建立一个qshell的配置文件upload.conf,并编辑其中的内容(https://img.mawenjian.net/2017/10/qiniu_upload_config.conf_.txt)如下:

{
"src_dir" : "/etc/nginx/logs/",
"bucket" : "your-bucket-name",
"overwrite" : false,
"check_exists" : false,
"check_hash" : false,
"check_size" : false,
"rescan_local" : true,
"skip_suffixes" : "access_log.log,error.log",
"log_file" : "upload.log",
"log_level" : "info",
"log_rotate" : 1,
"log_stdout" : false,
"file_type" : 0
}

其中,“src_dir”指的是将要被同步的本地文件夹,即存放Nginx日志的根目录(注:日志根目录和最终的日志文件中间可以嵌套多层文件夹,以方便同时备份多个站点的日志时使用);“bucket”是你在七牛云存储中创建的bucket名称;“skip_suffixes”是同步到七牛云存储时,将会被忽略掉的文件。因为我们只上传历史数据,所以这两个文件需要被忽略掉。

3、设置上传到七牛云存储采用的ak和sk:

cd /usr/local/qshell/
qshell account {ak} {sk}

将{ak}和{sk}替换为实际的ak和sk。注意:此为单用户模式,多用户模式请自行探索。相关文档:https://developer.qiniu.com/kodo/tools/1302/qshell#4

4、在日志目录下创建一个测试文件,并测试是否可以同步到七牛云存储中。

touch /etc/nginx/logs/test.log
cd /usr/local/qshell/ && ./qshell qupload upload.conf

二、创建Nginx日志切分和备份脚本

1、创建SHELL脚本文件,并赋予其可执行权限:

touch /usr/local/sbin/cut_nginx_logs.sh
chmod +x /usr/local/sbin/cut_nginx_logs.sh

2、将以下内容(https://img.mawenjian.net/2017/10/cut_nginx_logs.sh_.txt)粘贴到cut_nginx_logs.sh中,并按个人需要进行配置。

3、手工执行该文件,测试是否可以正常运行:

cd /usr/local/sbin/ && ./cut_nginx_logs.sh

三、配置crontab定时任务

1、首先,请确保操作系统中安装有crontab命令:

crontab -e

如果提示“-bash: crontab: command not found”错误,则请先安装crontab命令:

yum install -y vixie-cron

2、设置cron开机启动,并尝试启动该程序。以CentOS 6为例:

chkconfig crond on
service crond start

3、将下列内容添加到crontab配置文件“/etc/crontab”中,以在每天凌晨定时执行cut_nginx_logs.sh脚本:

00 00 * * * /bin/sh /usr/local/sbin/cut_nginx_logs.sh

4、重启crontab服务:

service crond start restart

5、查看上述执行脚本是否添加到定时任务队列:

crontab -e

到这里,就彻底搞定啦。是不是很简单?


除非特殊说明,本博客文章均为原创,转载请以链接形式标明博文地址。

本文链接地址: Nginx按天切分日志并自动备份到七牛云存储

分类:互联网 | 标签: |