Nginx 日志滚动

Nginx 日志滚动配置  

在linux下配置日志滚动一般都用系统自带的logrotate,但是在之前的使用中发现,如果一个daemon只打开一个日志文件写日志,在logroate的配置文件中使用copytruncate,会有少部分日志丢失。在对日志要求不是特别严格的情况下这是可行的,但有时候这丢失的几行日志很重要,就需要一个比较严格的日志滚动方法。 

通过搜索找到一种不错的方法,不用kill nginx,而是使用apache的rotatelogs 

[1] 安装apache,rotatelogs是apache自带的工具,配置日志目录
Shell代码  
  1. mkdir -p /opt/nginx_logs  
  2. cp rotatelogs /opt/nginx_logs/  
  3. chmod +x /opt/nginx_logs/rotatelogs  

[2] 创建命名管道
Shell代码  
  1. mkdir /opt/nginx_logs/abc_www/  
  2. mkfifo /opt/nginx_logs/abc_www/access_log  

[3] 配置nginx.conf,将access_log 指向命名管道
Shell代码  
  1. access_log  /opt/nginx_logs/abc_www/access_log  main;  

[4] 创建切割日志目录
Shell代码  
  1. mkdir /opt/nginx_logs/abc_www/log/  

[5] 日志切割脚本rotate.sh,用rotatelogs实现
Shell代码  
  1. #!/bin/sh  
  2.   
  3. baselogdir=/opt/nginx_logs/abc_www  
  4. rotatelogs=/opt/nginx_logs/rotatelogs  
  5.   
  6. while [ 1 ]  
  7. do  
  8. echo `date +"%F %T"`" rotatelogs access start"  
  9. $rotatelogs $baselogdir/log/access_%Y%m%d-%H%M%S.log 5M 480 < $baselogdir/access_log  
  10. echo `date +"%F %T"`" rotatelogs access stop"  
  11. sleep 1;  
  12. done  
按照5M的大小切割文件 
在实际应用中这个值应该设置得比较大,如果需要一天一个日志文件的话5M 改为 86400 = 24 * 60 * 60,也就是一天的秒数 

[6] 启动脚本run.sh
Shell代码  
  1. #!/bin/sh  
  2. sh /opt/nginx_logs/abc_www/rotate.sh >> /opt/nginx_logs/abc_www/log/access-rotate.log 2>&1 &  


[7] 测试,使用ab工具测试
Shell代码  
  1. ab -n 100000 -c 1000 "http://localhost/"  
  2. ##############################  
  3. -rw-r--r--. 1 root root 5245560 Apr 11 22:54 access_20150411-225410.log  
  4. -rw-r--r--. 1 root root 4251582 Apr 11 22:54 access_20150411-225427.log  
  5. -rw-r--r--. 1 root root 5245615 Apr 11 23:10 access_20150411-231035.log  
  6. -rw-r--r--. 1 root root 4254385 Apr 11 23:11 access_20150411-231048.log  


nginx配置错误检查  
另外在测试过程中发现error.log也在不断的增大,都是“Too many open files”错误 
进行如下检查: 
1. 检查nginx能打开的文件数
引用
ps ax | grep nginx 
36756 ?        Ss     0:00 nginx: master process nginx 
36757 ?        S      0:08 nginx: worker process
列出nginx的worker进程,然后 cat /proc/XXX/limits,其中XXX是worker进程的进程号,找到如下是行: 
引用
Max open files            1024                 4096                 files


2. 检查系统打开文件数 
引用
sysctl -a | grep file-max 
fs.file-max = 98684
系统默认值,这个值比较大暂时不修改 

通过检查发现系统能打开的文件数很大,但每个进程的文件数只有1024,这个可以用 ulimit -n 来确认 

错误修复  
因此需要修改配置来实现nginx的文件打开数 
1. 在nginx.conf中增加如下行
引用
worker_rlimit_nofile    15360;

2. 修改/etc/security/limits.conf,增加如下两行
引用
*               soft    nofile          10240 
*               hard    nofile          15360

3. 重启nginx,需要将master也停掉,不能时候用 kill -HUP ,然后再查看worker进程的Max open files 
引用
Max open files            15360                15360                files

修改成功,在测试时没有再报“Too many open files” 

参考: 
nginx日志按照天进行分割
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值