[Linux运维 -- webserver]nginx的日志轮转

nginx的日志轮转

今天突然发现nginx所在的机器出现了问题,报警磁盘空间快满了。 立马看看。

$df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2              50G  50G   50G   100% /
/dev/sda1             247M   23M  212M  10% /boot
tmpfs                  48G  368K   48G   1% /dev/shm
/dev/sda5             1.1T  491M  1.1T   1% /home

发现根目录满了,查询一下是哪个文件比较大,耗空间

$sudo find / -size +512M | xargs ls -lh
-rw-r--r-- 1 root root 3.5G Aug  8 15:16 /usr/local/openresty/nginx/logs/access.log
-rw-r--r-- 1 root root 3.0G Aug  8 15:16 /usr/local/openresty/nginx/logs/error.log

发现nginx的请求和错误日志文件已经非常大了。

[xxxxx:/usr/local/openresty/nginx/logs]
$ls
access.log  error.log  nginx.pid

到日志目录下,发现只有一个文件,原来nginx的日志文件没有做轮转导致的。

使用linux自带的logrotate日志轮询工具来对nginx的log做处理。

具体的格式如下:

$ cat /etc/logrotate.d/nginx 
/usr/local/openresty/nginx/logs/*.log { 
daily 
missingok 
rotate 20 
notifempty 
sharedscripts 
postrotate 
sudo kill -USR1 `cat /usr/local/openresty/nginx/logs/nginx.pid` > /dev/null 
endscript 
}

上面各行的意思为:

  • /usr/local/openresty/nginx/logs/*.log 为nginx的日志路径
  • daily 每天轮转一次
  • missingok 即使日志不存在也继续执行
  • rotate 20 保留20个备份
  • notifempty 如果空文件的话不转存
  • sharedscripts 在所有的日志文件都轮转完毕后统一执行一次脚本。如果没有配置这条指令,那么每个日志文件轮转完毕后都会执行一次脚本。
  • postrotate 轮转结束的动作
  • endscript 用于结束postrotate部分的脚本

脚本部分

sudo kill -USR1 `cat /usr/local/openresty/nginx/logs/nginx.pid` > /dev/null 

让nginx进程平滑加载

参考:

(1) http://os.51cto.com/art/200912/167478_all.htm
(2) http://huoding.com/2013/04/21/246
(3) http://blog.csdn.net/superhosts/article/details/8741227

原文地址:https://www.cnblogs.com/zk47/p/4755743.html