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日志的阅读习惯。因为日志文档会记录服务器的各种状态。我们可以根据数据进行及时修复和优化服务器配置。