Nginx access日志过滤css,jpg,js等日志记录

Nginx/Web服务器
423
0
0
2023-01-11
标签   Nginx日志

1. 介绍

当我们的css,js文件等内容没有通过CDN进行分发时。默认将会通过我们的本地服务器进行加载。例如当前博客网站样式,为了确保稳定。css和js等文件配置全部存储在了本地。

那么我们nginx access日志记录中,就会有大量的重复的css和js文件的日志记录。

例如:

Request:"GET /themes/joe2.0/source/lib/prism/prism.min.css?v=1.0.10 HTTP/1.1",Referer:"https://zinyan.com/?p=381",UserAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"
Request:"GET /themes/joe2.0/source/lib/prism/themes/prism-darcula.css?v=1.0.10 HTTP/1.1",Referer:"https://zinyan.com/?p=381",UserAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"
Request:"GET /themes/joe2.0/source/css/min/global.min.css?v=1.0.10 HTTP/1.1",Referer:"https://zinyan.com/?p=381",UserAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"
Request:"GET /themes/joe2.0/source/css/min/post.min.css?v=1.0.10 HTTP/1.1",Referer:"https://zinyan.com/?p=381",UserAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"
Request:"GET /themes/joe2.0/source/css/min/responsive.min.css?v=1.0.10 HTTP/1.1",Referer:"https://zinyan.com/?p=381",UserAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"
Request:"GET /themes/joe2.0/source/lib/fancybox/jquery.fancybox.min.css HTTP/1.1",Referer:"https://zinyan.com/?p=381",UserAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"
Request:"GET /themes/joe2.0/source/lib/jquery@3.5.1/jquery.min.js HTTP/1.1",Referer:"https://zinyan.com/?p=381",UserAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"
Request:"GET /themes/joe2.0/source/lib/lazysizes/lazysizes.min.js HTTP/1.1",Referer:"https://zinyan.com/?p=381",UserAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"
PS: 上面的日志样式通过https://zinyan.com/?p=444 文章可以了解,如何将日志内容输出成上面的效果。

那么我们可以配置日志过滤规则。

2. 配置

2.1 错误配置

我们如果直接填写以下配置。

 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {
    access_log off;
}

将上面内容放到了server中。那么所有的样式请求会出错,前端请求将会无法拉取js等样式链接。例如如下所示:

server {
    listen 443 ssl;
    ...
  
     location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {
        access_log off;
    }

    location / {
            
            gzip_static on;
            add_header Cache-Control public,max-age=60,s-maxage=60;
            proxy_set_header HOST $host;
           ...
    }
}

这样配置后,前端所有样式请求链接都会被拦截。error.log 中就会报错 ,类似下面的错误消息:

 open() "/etc/nginx/html/themes/joe2.0/source/lib/nprogress/nprogress.min.css" failed (2: No such file or directory), 

那么,我们正确的配置方法应该是如何的呢?可以使用日志筛选记录map进行配置。

PS:上面只是错误的一种写法。并不代表不能用location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ 进行过滤哦。

2.2 日志筛选map

我们在access_log 日志下 添加一个map对象; 配置传参为uri,默认为通过返回1,如果匹配到以下的正则表达式.*.(gif|jpg|jpeg|png|bmp|swf|js|css) 返回0。

map $uri $zinyanloggable {
    default 1;
    ~^(.*\.(gif|jpg|jpeg|png|bmp|swf|js|css|svg|woff|ttf)$) 0;
}

access_log  /var/log/nginx/access.log  main if=$zinyanloggable;

配置完毕后,通过:nginx -t 检测命令格式是否正确。检测通过后输入:service nginx reload。刷新nginx服务 就可以了。

这个时候我们的access日志就会将以上数据的请求给过滤掉。完整示例如下:

 http {
     include       /etc/nginx/mime.types;
     default_type  application/octet-stream;
 log_format  main  'Status:$status,Bytes:$body_bytes_sent,IP:$remote_addr,Time:[$time_iso8601],Host:"$http_host",Request:"$request",Referer:"$http_referer",UserAgent:"$http_user_agent"';
     map $uri $zinyanloggable {
        default 1;
        ~^(.*\.(gif|jpg|jpeg|png|bmp|swf|js|css|svg|woff|ttf|ico)$) 0;
         
 }

 access_log  /var/log/nginx/access.log  main if=$zinyanloggable;
     sendfile        on;
     #tcp_nopush     on;
     include /etc/nginx/conf.d/*.conf;
 }
PS: 请注意了,map对象只能在http{}范围下使用。

配置完毕后,我们的access日志将会少很多日志。

PS:建议养成log日志的阅读习惯。因为日志文档会记录服务器的各种状态。我们可以根据数据进行及时修复和优化服务器配置。