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