Nginx访问日志主要记录部署在nginx上的网站访问数据,日志格式定义在nginx主配置文件中。css
nginx主配置文件:/etc/nginx/nginx.conflinux
查看nginx主配置文件:nginx
```markup
[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:若是使用了代理,记录代理IPshell
访问日志配置路径:

**针对单个nginx虚拟主机配置访问日志:**浏览器
1.编辑nginx虚拟主机配置文件:缓存
```markup
[root@linux ~]# vi /etc/nginx/conf.d/default.conf
```
2.定义访问日志存放路径和格式:

3.重载nginx:服务器
```markup
[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.在浏览器访问虚拟主机配置的网站后便可生成日志信息:
```markup
[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日志不记录静态文件:**curl
在上面定义好的访问日志中,会记录特别多的请求信息,因此须要过滤掉一些图片、js、css类的请求日志,这样的日志通常记录的意义不大,当网站访问量大时还特别耗费磁盘空间。工具
编辑nginx虚拟主机配置文件:post
```markup
[root@linux ~]# vi /etc/nginx/conf.d/default.conf
```
添加如下内容:
```markup
location ~* \.(png|jpeg|gif|js|css|bmp|flv)$
{
access_log off;
}
```
#包含.png/.jpeg/.gif/.js/.css/.bmp/.flv结尾的请求就不会记录到访问日志中,点前面的 \ 表示脱义符,shell中点表示任意字符,~*表示不区分大小写匹配,详情查看上一篇文章:[nginx location优先级详解](https://blog.csdn.net/Powerful_Fy/article/details/102555453)
重载nginx便可生效:
```markup
[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日志切割配置文件:
```markup
[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切割配置文件中:
```markup
/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
}
```
测试:
```markup
[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等静态文件设置缓存过时时间:
```markup
[root@linux ~]# vi /etc/nginx/conf.d/default.conf
```
在针对png/jpeg/js/css等静态文件location中添加expires配置项:
```markup
location ~* \.(png|jpeg|gif|js|css|bmp|flv)$
{
access_log off;
expires 1d;
}
```
#定义expires配置项值为1d,表示缓存过时时间为1天,若是上次访问网站时间超过1天就会更新缓存的静态文件,时间单位还能够设置为h(小时)、m(分钟)
什么是防盗链?
1.分别有两个网站A和B,A网站经过http地址引用了B网站的图片,这就叫作盗链
2.防盗链:防止A引用B网站的图片
当前B网站www.blog.com下有一张图片5.jpg,访问测试:
```markup
[root@linux ~]# curl -I -x127.0.0.1:80 http://www.blog.com/5.jpg
HTTP/1.1 200 OK
```
#http状态码200,能够访问该图片
使用A网站test.bbs.com引用B网站www.blog.com的图片5.jpg:
```markup
[root@linux ~]# curl -I -x127.0.0.1:80 -e http://test.bbs.com/5.jpg http://www.blog.com/5.jpg
HTTP/1.1 200 OK
```
#http状态码200,A网站成功引用了B网站的图片5.jpg
**配置nginx防盗链:**
打开nginx虚拟主机配置文件(B网站www.blog.com的配置文件):
```markup
[root@linux ~]# vi /etc/nginx/conf.d/default.conf
```
添加以下配置:
```markup
location ~ \.(png|gif|jpeg|bmp|mp3|mp4|flv|jpg)$
{
valid_referers none blocked server_names *.blog.com;
if ($invalid_referer) {
return 403;
}
}
```
#location的对象为.png/.gif/.jpeg/.bmp/.mp3/.mp4/.flv/.jpg表示防止引用的对象是这些格式的文件,server_names:指定白名单地址,非白名单地址对图片的引用将会返回http状态码403
重载配置文件:
```markup
[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
```
测试:
访问B网站www.blog.com的图片5.jpg:
```markup
[root@linux ~]# curl -I -x127.0.0.1:80 http://www.blog.com/5.jpg
HTTP/1.1 200 OK
```
#http状态码200,能够访问(由于nginx防盗链设置的白名单为*.blog.com)
再次使用A网站test.bbs.com引用B网站www.blog.com的图片5.jpg:
```markup [root@linux ~]# curl -I -x127.0.0.1:80 -e http://test.bbs.com/5.jpg http://www.blog.com/5.jpg HTTP/1.1 403 Forbidden ``` #http状态码403,防盗链配置成功,白名单外的地址已没法引用B网站www.blog.com下的5.jpg