当前位置: 首页 > 架构相关 > nginx日志写入备份配置相关

nginx日志写入备份配置相关

  • 分类:架构相关
  • 本文标签: nginx
  • 发布时间:2015-12-10 23:12:03
  • 作者:Ferman
  • 查看数: 137

随着网站访问量增加,日志需要定时进行备份分析。避免单个日志文件过大浪费服务器存储。

定义日志格式

http {
          #默认的日志配置格式
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
#如果开启则图片等一些非必要的信息会写入  access.log中
access_log  off;
          #自定义日志配置格式,去除一些不必要信息
log_format  mylog  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
access_log off;

}


在server中选择日志格式并定义写入方式

server {
listen          80;
server_name     cui.zhbor.com;
root /www/LJL/Html/Blog_cui;

#mylog采用自定义的日志格式。buffer 的意思是在内存中超过10k后才写入日志文件
access_log  logs/cui.zhbor.log  mylog buffer=10k;
location / {
index index.php;
try_files $uri $uri/ /index.php?c=default&a=showerror;
#列表页
rewrite ^/list/([0-9a-zA-Z\-_]+)/([0-9]+)/$ /index.php?c=list&a=default&cate=$1&page=$2 last;
#rewrite ......
}
}


最后将日志文件每周(根据实际情况)进行定时打包,最后进行统计分析,定时打包脚本如下

#!/bin/bash
logs_path="/usr/local/nginx/logs/"
#以前的日志文件
log_name="cui.zhbor.log"
pid_path="/usr/local/nginx/logs/nginx.pid"
mv ${logs_path}${log_name} ${logs_path}${log_name}_$(date --date="LAST   WEEK" +"%Y-%m-%d").log
kill -USR1 `cat ${pid_path}`




在没有执行kill -USR1 `cat ${pid_path}`之前,即便已经对文件执行了mv命令而改变了文件名称,nginx还是会向新命名的文件” xxx.log_ 20130909”照常写入日志数据的。原因在于:linux系统中,内核是根据文件描述符来找文件的。


下面是在网上找的对linux文件描述符的理解:

 

文件描述符是linux内核为每个打开的文件命名的一个整数标识。

linux内核为每一个进程生成(或者说维护)一个”文件描述符表”,这个文件描述符表记录的是“此进程所打开的文件(进行标识)”。

在这里的环境中,nginx就是一个运行中的进程,这个进程早就打开了一个日志文件,在文件描述符表是记录了文件的。

即便日志文件的路径改变了,但是还是能够找到(根据文件描述符表可以定位)。

 ----------------------------------------------

当执行命令“kill -USR1 `cat ${pid_path}`”的时候,nginx.pid文件中保存的其实就是一个数字(自己可以打开看一下,我这里是894),nginx 将其主进程的 pid (进程号)写入到了nginx.pid 文件中,所以可以通过cat命令直接拿到其主进程号,直接操作指定的进程号。

 

kill  -USR1 `cat ${pid_path}` 就等同于

kill –USR1 894  #指定发信号(USR1)信号给这个进程编号。

 

在linux系统中,linux是通过信号与”正在运行的进程”进行通信的。linux系统中,也很多预定义好的信号,像SIGHUP。USR1是用户自定义信号。可以理解为:进程自己定义接到这个信号该干嘛(也就是进程编写者自己确定收到这个信号干嘛还是什么都不做都行,完全交给开发人员自己决定)。而在nginx中,它自己编写了代码处理当我接到USR1信号的时候,让nginx重新打开日志文件。具体原理如下:

1、nginx 的主进程收到USR1信号,会重新打开日志文件(以nginx配置文件中的日志名称命名,就是配置文件中access_log项所设置的值,如果文件不存在,会自动创建一个新的文件xxx.log)。

 

2、然后把日志文件的拥有者改为“工作进程(worker进程)”,目的是让worker进程就具备了对日志文件的读写权限(master和worker通常以不同用户运行,所以需要改变拥有者)。

 

3、nginx主进程会关闭重名的日志文件(也就是刚才使用mv命令重命名成xxx.log_ 20130909.log的文件),并通知工作进程使用新打开的日志文件(刚才主进程打开的文件xxx.log)。具体实现上更细化点就是,主进程把USR1信号发给worker,worker接到这个信号后,会重新打开日志文件(也就是配置文件中约定的xxx.log)


转载时请以 超链接的形式 注明:转自Ferman

                  

About me