您的位置:首页 > 运维架构 > Nginx

nginx访问日志/日志切割/静态文件过期时间/防盗链

2019-10-17 13:14 387 查看

Nginx访问日志主要记录部署在nginx上的网站访问数据,日志格式定义在nginx主配置文件中。

nginx主配置文件:/etc/nginx/nginx.conf

查看nginx主配置文件:

```markup
[root@linux ~]# cat /etc/nginx/nginx.conf 
```
下图红框内就是定义的nginx访问日志的格式:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191015141253347.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1Bvd2VyZnVsX0Z5,size_16,color_FFFFFF,t_70)
#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

访问日志配置路径:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191015143905960.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1Bvd2VyZnVsX0Z5,size_16,color_FFFFFF,t_70)
**针对单个nginx虚拟主机配置访问日志:**

1.编辑nginx虚拟主机配置文件:

```markup
[root@linux ~]# vi /etc/nginx/conf.d/default.conf
```
2.定义访问日志存放路径和格式:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191015144313204.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1Bvd2VyZnVsX0Z5,size_16,color_FFFFFF,t_70)
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日志不记录静态文件:**

在上面定义好的访问日志中,会记录特别多的请求信息,所以需要过滤掉一些图片、js、css类的请求日志,这样的日志一般记录的意义不大,当网站访问量大时还特别耗费磁盘空间。

编辑nginx虚拟主机配置文件:

```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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Nginx logrotate
相关文章推荐