首页 » PHP教程 » nginxphperrorlog技巧_Nginx 解决errorlog和accesslog日志的改进总结

nginxphperrorlog技巧_Nginx 解决errorlog和accesslog日志的改进总结

访客 2024-11-11 0

扫一扫用手机浏览

文章目录 [+]

通过调度nginx配置,办理error中的大量报错提示。
通过过滤js等静态资源减少大量的access日志记录内容。

同时,经由利用阿里云安全组封禁大量国外ip地址的访问。
我的access.log文件和error.log的尺寸得到了有效压缩管理。

nginxphperrorlog技巧_Nginx 解决errorlog和accesslog日志的改进总结

access.log 从原来的12m旁边的的文件,变成了现在的400KB。
记录的访问数据也清晰了很多。

nginxphperrorlog技巧_Nginx 解决errorlog和accesslog日志的改进总结
(图片来自网络侵删)

error.log也从原来的8M旁边的文件,变成了现在的1KB,或者300Bytes的文件。
乃至有时候还是0 Bytes。

日志文件的减少,也降落了做事器的IO读取的性能开支。
可以将更多的内存资源用于处理正常的要求。

可以说是一个双赢的结局。

本篇作为一个回顾总结内容。
详细的error文件内容配置可以参考:https://zinyan.com/?p=450 ,https://zinyan.com/?p=453。
access.log的文件配置可以参考:https://zinyan.com/?p=445,https://zinyan.com/?p=444,以及爬虫屏蔽过滤返回444:https://zinyan.com/?p=454

2. 总结

现在error文件中,剩下的记录紧张便是SSL: error:141CF06C:SSL routines:tls_parse_ctos_key_share:bad key share非常了。

处理这个非常,可以通过封禁ip地址的访问,也可以不用在意。

剩下的便是access.log文件了。

当我们配置UserAgent要求中带有爬虫关键字的要求直接返回444之后,例如:

Status:444,Bytes:0,IP:185.117.225.171,Time:[2022-11-24T04:18:36+08:00],Host:"zinyan.com",Request:"GET /robots.txt HTTP/1.1",Referer:"-",UserAgent:"python-requests/2.28.1"Status:444,Bytes:0,IP:51.77.247.119,Time:[2022-11-24T04:57:39+08:00],Host:"47.101.47.241",Request:"POST /phpinfo HTTP/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/HEAD HTTP/1.1",Referer:"-",UserAgent:"RepoLookoutBot/1.0.0 (abuse reports to abuse@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/HEAD HTTP/1.1",Referer:"-",UserAgent:"RepoLookoutBot/1.0.0 (abuse reports to abuse@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",Request:"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 修正access_log 记录

在/etc/nginx/nginx.conf文件中修正如下:

http { ... 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; ~^(.\.(ico|gif|jpg|jpeg|png|bmp|swf|js|css|svg|woff|ttf|jfif|webp)$) 0; } access_log /var/log/nginx/access.log main if=$zinyanloggable; ... }

这样,access文件中就不会添加ico|gif|jpg|jpeg|png|bmp|swf|js|css|svg|woff|ttf|jfif|webp 作为后缀结尾的日志内容了。

3.2 map实现爬虫屏蔽

老版本写法为:

server{ ... if ($http_user_agent ~ ^$){ return 444; } if ($http_user_agent ~ "scrapy|python|curl|java|wget|httpclient|okhttp|MJ12bot|Expanse|ahrefsbot|seznambot|serpstatbot|sindresorhus|zgrab"){ return 444; } ... }

效率比较低,如果是多个server那么得写多遍。
以是修正为map的规则进行

但是如果改为map的话,须要在http{}之中先创建map规则,然后再到server中利用就可以了。
示例如下:

http { ... # 创建一个屏蔽规则zinyanUA,而它的取值从$http_user_agent 中获取。
map $http_user_agent $zinyanUA { default 0; ~(scrapy|python|curl|java|wget|httpclient|okhttp|MJ12bot|Expanse|ahrefsbot|seznambot|serpstatbot|sindresorhus|zgrab|censys|RepoLookoutBot) 1; ~ ^$ 1; } ... }

语法阐明:

~ 表示正则表达式对大小写敏感。

~ 表示正则表达式对大小写不敏感。

后面随着的内容便是正则表达式了

在正则表达式中^代表开头,$代表结尾,^$就代表开头和结尾中间没有字符。
也便是字符串为空的。

配置完毕后,在须要的server{}段中添加:

server{ ... if ($zinyanUA){ return 444; } ... }

由于在nginx 的if判断中,参数值0或者为空字符串,会判断为false,其他判断为true。

而我在上面创建的map工具中,规范了,如果匹配就返回1,不匹配返回0。
以是if ($zinyanUA)为true的便是须要返回444的要求了。

nginx: [emerg] unknown directive "if($http_host)" in /etc/nginx/conf.d/zinyan.conf:49 nginx: configuration file /etc/nginx/nginx.conf test failed

如果你涌现了这个if命名缺点的提示,并不是所谓的缺少if命名的依赖库,而是Nginx中的if命名和括号中间须要有空格。

nginx -t 检测通过后,通过service nginx reload刷新配置就可以生效了。

PS:如果实在过滤不了的,建议直接封IP地址,特殊是国外的访问。
海内也有不少的攻击

标签:

相关文章

语言游戏聚会的魅力,跨界交流的盛宴

在繁忙的都市生活中,一场别开生面的语言游戏聚会悄然兴起。这不仅是一场简单的娱乐活动,更是一次跨界交流的盛宴,一场思想的碰撞与火花。...

PHP教程 2024-12-29 阅读0 评论0

语言序列逻辑在现代传播中的运用与影响

语言序列逻辑,作为现代传播学中的重要理论之一,对于理解语言传播的规律、提高传播效果具有重要作用。在信息化、网络化时代,语言序列逻辑...

PHP教程 2024-12-29 阅读0 评论0