Nginx访问日志主要记录部署在nginx上的网站访问数据,日志格式定义在nginx主配置文件中。
nginx主配置文件:/etc/nginx/nginx.conf
查看nginx主配置文件:
[root@linux ~]# cat /etc/nginx/nginx.conf
下图红框内就是定义的nginx访问日志的格式:
#main:格式名
$remote_addr:访问网站的IP
$remote_user:如果配置了用户认证,表示用户认证的用户名
$time_local:访问时间
$request:http方法,请求的链接,http版本
$status:http状态码
$body_bytes_sent:请求大小
$http_referer:客户端请求时的referer,通俗讲就是该请求是通过哪个链接跳转过来的
$http_user_agent:客户端操作系统和浏览器标识
$http_x_forwarded_for:如果使用了代理,记录代理IP
访问日志配置路径:
针对单个nginx虚拟主机配置访问日志:
1.编辑nginx虚拟主机配置文件:
[root@linux ~]# vi /etc/nginx/conf.d/default.conf
[root@linux ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@linux ~]# nginx -s reload
4.在浏览器访问虚拟主机配置的网站后即可生成日志信息:
[root@linux ~]# cat /data/logs/nginx.log
192.168.234.1 - - [15/Oct/2019:14:48:15 +0800] "GET /?p=1 HTTP/1.1" 200 57931 "http://www.blog.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36" "-"
192.168.234.1 - - [15/Oct/2019:14:48:15 +0800] "GET /wp-includes/js/comment-reply.min.js?ver=5.2.3 HTTP/1.1" 301 169 "http://www.blog.com/?p=1" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36" "-"
192.168.234.1 - - [15/Oct/2019:14:48:15 +0800] "GET /wp-includes/js/comment-reply.min.js?ver=5.2.3 HTTP/1.1" 200 2234 "http://www.blog.com/?p=1" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36" "-"
nginx日志不记录静态文件:
在上面定义好的访问日志中,会记录特别多的请求信息,所以需要过滤掉一些图片、js、css类的请求日志,这样的日志一般记录的意义不大,当网站访问量大时还特别耗费磁盘空间。
编辑nginx虚拟主机配置文件:
[root@linux ~]# vi /etc/nginx/conf.d/default.conf
添加以下内容:
location ~* \.(png|jpeg|gif|js|css|bmp|flv)$
{
access_log off;
}
#包含.png/.jpeg/.gif/.js/.css/.bmp/.flv结尾的请求就不会记录到访问日志中,点前面的 \ 表示脱义符,shell中点表示任意字符,~*表示不区分大小写匹配,详情查看上一篇文章:nginx location优先级详解
重载nginx即可生效:
[root@linux ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@linux ~]# nginx -s reload
nginx访问日志切割:
当nginx访问日志记录的信息越来越大的时候,不仅占磁盘空间还影响查看日志等操作,定时对nginx访问日志进行切割操作可以便于日志管理与查看
linux系统自带的日志切割工具logrotate:
配置文件:/etc/logrotate.conf
子配置文件:/etc/logrotate.d/*
由于当前机器上nginx是yum安装的,所以logrotate子配置文件目录已经存在nginx日志切割配置文件:
[root@linux ~]# cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily #按天切割
missingok #忽略报错
rotate 52 #保留52个切割文件(也就是52天)
compress #压缩(延后一天才会压缩)
delaycompress
notifempty #为空不压缩
create 640 nginx adm #创建新日志的权限,老日志文件会更名(xxxlog-20190101)
sharedscripts #从新载入配置文件,生成新的日志文件
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
#该配置文件第一行切割的日志文件为nginx访问日志文件
将上面添加的nginx单个虚拟主机的访问日志添加到nginx切割配置文件中:
/var/log/nginx/*.log /data/logs/nginx.log{ #添加虚拟主机的访问日志路径
daily
dateext #切割文件按日期后缀保留
missingok
rotate 52
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
测试:
[root@linux ~]# logrotate -f /etc/logrotate.d/nginx
[root@linux ~]# ls /data/logs/
nginx.log nginx.log-20191015
#显示已成功切割,接下来每天凌晨就会自动切割nginx虚拟主机的访问日志了
nginx缓存静态文件过期时间配置:
上文中将png/jpeg/js/css等静态文件设置为不记录访问日志,那么这些文件在首次访问网站时,会缓存到本地,之后再吃访问,由于有了缓存就不会继续向服务器请求这些静态文件,节省带宽,但是如果网站有更新,涉及到的缓存不更新的话就显示不出更新内容,所以需要让缓存文件有时效性。
针对png/jpeg/js/css等静态文件设置缓存过期时间:
[root@linux ~]# vi /etc/nginx/conf.d/default.conf
在针对png/jpeg/js/css等静态文件location中添加expires配置项:
location ~* \.(png|jpeg|gif|js|css|bmp|flv)$
{
access_log off;
expires 1d;
}
#定义expires配置项值为1d,表示缓存过期时间为1天,如果上次访问网站时间超过1天就会更新缓存的静态文件,时间单位还可以设置为h(小时)、m(分钟)