vim /usr/local/nginx/conf/vhost/../nginx.conf
找到如下,是定义日志格式:
log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'
' $host "$request_uri" $status'
' "$http_referer" "$http_user_agent"';
combined_realip; 是定义日志的名称可以改为zhdy。
注:这边改成什么名字,待会引用的时候就写成什么!
$remote_addr | 客户端IP(公网IP) |
---|---|
$http_x_forwarded_for | 代理服务器的IP |
$time_local | 服务器本地时间 |
$host | 访问主机名(域名) |
$request_uri | 访问的url地址 |
$status | 状态码 |
$http_referer | referer 源地址 |
$http_user_agent | user_agent |
如上除了在主配置文件nginx.conf里定义日志格式外,还需要在虚拟主机配置文件中增加:
access_log /tmp/haha.com_acess.log zhdy;
-t && -s reload 测试并重载。
[[email protected] vhost]# curl -x127.0.0.1:80 www.haha.com/admin.php -uzhdy:asd9577
this is test page which test if you needs key or not![[email protected] vhost]# ls /tmp/
haha.com_acess.log
[[email protected] vhost]# cat /tmp/haha.com_acess.log
127.0.0.1 - [11/Aug/2017:18:13:12 +0800] www.haha.com "/admin.php" 200 "-" "curl/7.29.0"
然后我们就看到已经展现出了咱们刚刚定义个一种格式的日志。
日志对于统计排错来说非常有利的,但是如果一个100G的日志别说查看了就打开我们都需要等待很久这样不仅浪费了我们的硬件资源同时也浪费了时间。如果按照每天分成一个日志,是不是更有利于我们去排障呢?
由于Nginx不像Apache有自己的切割工具,在此我们需要写个脚本完成需求:
养成好的习惯把脚本放在sbin目录下:
vim /usr/local/sbin/nginx_logrotate.sh
添加如下内容:
d=`date -d "-1 day" +%Y%m%d`
logdir="/tmp/"
nginx_pid="/usr/local/nginx/logs/nginx.pid"
cd $logdir
for log in `ls *.log`
do
mv $log $log-$d
done
/bin/kill -HUP `cat $nginx_pid`
d=date -d "-1 day" +%Y%m%d
;生成昨天的日期
nginx_pid=”/usr/local/nginx/logs/nginx.pid”;就是为了最后一行而设定的。最后一行的意思和之前使用的 -s reload 是一个意思 重载nginx.pid,然后就会再次生成一个新的日志文件。
for log in `ls *.log`
do
mv $log $log-$d
done
把ls出来的log文件重新以日期的形式重命名。
测试:
[root@zhdy-03 vhost]# sh /usr/local/sbin/nginx_logrotate.sh
[root@zhdy-03 vhost]# ls /tmp/
haha.com_acess.log
haha.com_acess.log-20170810
然后就会有一个昨天的访问日志
例如针对每天的慢日志进行日志切割:
#! /bin/bash
d=`date -d "-1 day" +%Y%m%d`
logdir="/usr/local/php-fpm/var/log/"
nginx_pid="/usr/local/nginx/logs/nginx.pid"
cd $logdir
for log in `find . -name "*_slow.log"`
do
mv $log $log-$d
done
/bin/kill -HUP `cat $nginx_pid`
find . -name "*_slow.log-*" -mtime +30 | xargs rm -rf
2.2 日志清理
有了切割可以满足我们的日常工作需要,但是随着访问量的剧增,如果不删除老的日志文件我们的磁盘很快就会占用完。
删除超过一个月的日志(当然这个也可以写在脚本里面)
find /tmp/ -name *.log-* -mtime +30 | xargs rm rf
2.3 创建计划任务
crontab -e
加入如下内容
0 0 * * * /bin/bash /usr/local/sbin/nginx_logrotate.sh
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 7d;
access_log off;
}
location ~ .*\.(js|css)$
{
expires 12h;
access_log off;
}
详解:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 7d;
access_log off;
}
匹配.gif .jpg .jpeg等格式的静态文件不计入日志
测试+重载 (-t && -s reload)
[[email protected]03 www.haha.com]# curl -x127.0.0.1:80 www.hehe.com/asd.asd
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
[[email protected]03 www.haha.com]# curl -x127.0.0.1:80 www.hehe.com/1.js
TEST JS
[[email protected]03 www.haha.com]# curl -x127.0.0.1:80 www.hehe.com/2.jpg
JPG TEST
[[email protected]03 www.haha.com]# cat /tmp/haha.com_access.log
127.0.0.1 - [11/Aug/2017:21:58:30 +0800] www.hehe.com "/admin.php" 200 "-" "curl/7.29.0"
127.0.0.1 - [11/Aug/2017:21:58:38 +0800] www.hehe.com "/asd.asd" 404 "-" "curl/7.29.0"
随便自定义了一个asd.asd被记录到日志,但是1.js和2.jpg均没有被计入到日志
测试过期时间:
[[email protected] www.haha.com]# curl -x127.0.0.1:80 www.hehe.com/2.jpg -I
HTTP/1.1 200 OK
Server: nginx/1.12.1
Date: Fri, 11 Aug 2017 14:12:22 GMT
Content-Type: image/jpeg
Content-Length: 10
Last-Modified: Fri, 11 Aug 2017 13:58:19 GMT
Connection: keep-alive
ETag: "598db7fb-a"
Expires: Fri, 18 Aug 2017 14:12:22 GMT
Cache-Control: max-age=604800
Accept-Ranges: bytes