当前位置: 首页 > 科技观察

Nginx解决error.log和access.log日志的改进总结

时间:2023-03-19 00:08:19 科技观察

1。Introduction自从了解错误和访问日志的重要性,并学习阅读相关的日志文档。通过调整nginx配置,解决报错中大量的错误提示。通过过滤js等静态资源,减少大量访问日志内容。同时利用阿里云安全组阻断大量国外ip地址的访问。我的access.log文件和error.log文件的大小得到有效压缩和管理。access.log从原来的12m文件变成了现在的400KB。记录的访问数据也更加清晰。error.log也从原来的8M文件变成了现在的1KB,即300Bytes文件。甚至有时是0字节。日志文件的减少也减少了服务器IO读取的性能开销。更多的内存资源可以用来处理正常的请求。可以说是双赢的结果。本文作为综述。具体报错文件内容配置请参考:https://img.ydisp.cn/news/20221213/dudwzfw0435、https://zinyan.com/?p=453。access.log的文件配置可以参考:https://zinyan.com/?p=445、https://zinyan.com/?p=444,爬虫屏蔽过滤器返回444:https://zinyan。com/?p=4542。综上所述,错误文件中剩余的记录主要是SSL:error:141CF06C:SSLroutines:tls_parse_ctos_key_share:badkeyshareisabnormally。处理这个异常,可以屏蔽访问ip地址,也可以忽略。剩下的就是access.log文件。当我们在UserAgent请求中配置crawler关键字直接返回444请求时,例如:Status:444,Bytes:0,IP:185.117.225.171,Time:[2022-11-24T04:18:36+08:00],Host:"zinyan.com",Request:"GET/robots.txtHTTP/1.1",Referer:"-",UserAgent:"python-requests/2.28.1"Status:444,Bytes:0,IP:51.77.247.119,时间:[2022-11-24T04:57:39+08:00],主机:"47.101.47.241",请求:"POST/phpinfoHTTP/1.1",Referer:"-",UserAgent:"curl/7.64.0"对比不同日期的access.log,可以发现爬虫请求的数量在不断减少。因为当爬虫多次请求,结果为444时,会逐渐降低对我们网站的爬取级别,最后犹豫拿不到数据而放弃爬取。但是也会有一些新加入的爬虫需要我们注意,加入到过滤条件中。并且还有一些过滤不能生效的情况,我们需要随时修改一些配置,例如:Status:404,Bytes:177,IP:18.195.96.149,Time:[2022-11-24T04:58:10+08:00],Host:"zinyan.com",Request:"GET/s/.git/HEADHTTP/1.1",Referer:"-",UserAgent:"RepoLookoutBot/1.0.0(滥用报告滥用@repo-lookout.org)"Status:404,Bytes:186,IP:18.195.96.149,Time:[2022-11-24T04:58:42+08:00],Host:"zinyan.com",Request:"GET/categories/.git/HEADHTTP/1.1",Referer:"-",UserAgent:"RepoLookoutBot/1.0.0(abusereportstoabuse@repo-lookout.org)"我们需要添加:RepoLookoutBot爬虫过滤器工具。同样通过CensysInspect工具:Status:400,Bytes:248,IP:167.248.133.62,Time:[2022-11-24T07:17:24+08:00],Host:"47.101.47.241:443",Request:"GET/HTTP/1.1",Referer:"-",UserAgent:"Mozilla/5.0(compatible;CensysInspect/1.1;+https://about.censys.io/)"同时,一些可以被屏蔽屏蔽过程以及一些无法屏蔽的问题:Status:444,Bytes:0,IP:167.248.133.62,Time:[2022-11-24T07:17:20+08:00],Host:"47.101.47.241:443",请求:"GET/HTTP/1.1",Referer:"-",UserAgent:"-"Status:400,Bytes:248,IP:167.248.133.62,Time:[2022-11-24T07:17:23+08:00],Host:"47.101.47.241:443",Request:"GET/HTTP/1.1",Referer:"-",UserAgent:"-"从access.log可以看出两次访问,可以说是一模一样。但是一个返回444,一个返回400,返回444说明我的nginx过滤规则生效了。而400语句并没有生效。同时,还需要添加Host为空的访问,并进行过滤,例如:Status:400,Bytes:150,IP:167.248.133.62,Time:[2022-11-24T07:17:24+08:00],Host:"-",Request:"PRI*HTTP/2.0",Referer:"-",UserAgent:"-"同时我们还可以查看是否所有静态资源都被过滤,例如,我的资源使用jfif,webp文件。我只需要将它添加到过滤规则中。PS:可能会有一些过滤失败,但总体来说。提高网站安全性,减少大量非法请求。就收获而??言,为这些配置付出是值得的。3、完善nginx的过滤规则根据发现的问题,再次完善access的过滤规则。以及非法请求返回444的判断逻辑。3.1修改/etc/nginx/nginx.conf文件中的access_log记录如下:http{...log_formatmain'Status:$status,Bytes:$body_bytes_sent,IP:$remote_addr,Time:[$time_iso8601],Host:"$http_host",请求:"$request",Referer:"$http_referer",UserAgent:"$http_user_agent"';地图$uri$zinyanloggable{默认1;~^(.*\.(ico|gif|jpg|jpeg|png|bmp|swf|js|css|svg|woff|ttf|jfif|webp)$)0;}access_log/var/log/nginx/access.logmainif=$zinyanloggable;...}这样access文件就不会在末尾添加ico|gif|jpg|jpeg|png|bmp|swf|js|css|svg|woff|ttf|jfif|webp作为日志内容了后缀。3.2map实现爬虫屏蔽老版本写法为:server{...if($http_user_agent~^$){return444;}if($http_user_agent~*"scrapy|python|curl|java|wget|httpclient|okhttp|MJ12bot|Expanse|ahrefsbot|seznambot|serpstatbot|sindresorhus|zgrab"){返回444;}...}效率比较低,如果有多个服务器,需要写多次。所以修改规则为map,但是如果改成map,需要先在http{}中创建map规则,然后在服务端使用。示例如下:http{...#创建一条拦截规则zinyanUA,其值从$http_user_agent中获取。地图$http_user_agent$zinyanUA{默认0;~*(scrapy|python|curl|java|wget|httpclient|okhttp|MJ12bot|Expanse|ahrefsbot|seznambot|serpstatbot|sindresorhus|zgrab|censys|RepoLookoutBot)1;~^$1;}...}语法解释:~表示正则表达式区分大小写。~*表示正则表达式不区分大小写。后面的内容是正则表达式。正则表达式中,^代表开始,$代表结束,^$表示开始和结束之间没有字符。即,字符串为空。配置完成后,在需要的server{}部分添加:server{...if($zinyanUA){return444;}...}因为在nginx的if判断中,参数值为0或者空字符串,会被判断为false,其他判断为true。而在我上面创建的map对象中,是标准化的,匹配则返回1,不匹配则返回0。所以如果($zinyanUA)为true就是需要返回444的request。nginx:[emerg]unknowndirective"if($http_host)"in/etc/nginx/conf.d/zinyan.conf:49nginx:configurationfile/etc/nginx/nginx.conftestfailedIfyouhavethisifnamingerror提示并不是所谓的缺少if-named依赖库,而是Nginx中if-named和括号之间需要空格。nginx-t检测通过后,通过servicenginxreload刷新配置生效。PS:如果无法过滤,建议直接屏蔽IP地址,尤其是国外访问。国内也有很多袭击事件