Nginx 解決error.log和access.log日志的改善總結(jié)
1. 介紹
自從了解了error和access日志的重要性,并且學(xué)會(huì)閱讀相關(guān)log文檔之后。
通過(guò)調(diào)整nginx配置,解決error中的大量報(bào)錯(cuò)提示。通過(guò)過(guò)濾js等靜態(tài)資源減少大量的access日志記錄內(nèi)容。
同時(shí),經(jīng)過(guò)使用阿里云安全組封禁大量國(guó)外ip地址的訪問(wèn)。我的access.log文件和error.log的尺寸得到了有效壓縮管理。
access.log 從原先的12m左右的的文件,變成了現(xiàn)在的400KB。記錄的訪問(wèn)數(shù)據(jù)也清晰了很多。
error.log也從原先的8M左右的文件,變成了現(xiàn)在的1KB,或者300Bytes的文件。甚至有時(shí)候還是0 Bytes。
日志文件的減少,也降低了服務(wù)器的IO讀取的性能開(kāi)支。可以將更多的內(nèi)存資源用于處理正常的請(qǐng)求。
可以說(shuō)是一個(gè)雙贏的結(jié)局。
本篇作為一個(gè)回顧總結(jié)內(nèi)容。具體的error文件內(nèi)容配置可以參考:https://zinyan.com/?p=450 ,https://zinyan.com/?p=453。access.log的文件配置可以參考:https://zinyan.com/?p=445,https://zinyan.com/?p=444,以及爬蟲屏蔽過(guò)濾返回444:https://zinyan.com/?p=454
2. 總結(jié)
現(xiàn)在error文件中,剩下的記錄主要就是SSL: error:141CF06C:SSL routines:tls_parse_ctos_key_share:bad key share異常了。
處理這個(gè)異常,可以通過(guò)封禁ip地址的訪問(wèn),也可以不用在意。
剩下的就是access.log文件了。
當(dāng)我們配置UserAgent?請(qǐng)求中帶有爬蟲關(guān)鍵字的請(qǐng)求直接返回444之后,例如:
對(duì)比不同日期的access.log 可以發(fā)現(xiàn),爬蟲請(qǐng)的數(shù)量在不斷變少。
因?yàn)楫?dāng)爬蟲多次請(qǐng)求得到結(jié)果是444后,會(huì)漸漸降低我們網(wǎng)站的爬取級(jí)別,最終猶豫得不到數(shù)據(jù)而放棄爬取。
但是,也會(huì)有一些新增加的爬蟲需要我們注意,并添加到過(guò)濾條件中。
而且也有一些過(guò)濾無(wú)法生效的情況,需要我們隨時(shí)進(jìn)行一些配置的修改例如:
我們需要新增:RepoLookoutBot 爬蟲工具的過(guò)濾。還有通過(guò)CensysInspect 工具:
同時(shí)在屏蔽過(guò)程中出現(xiàn)了有些能夠屏蔽而有些無(wú)法屏蔽的問(wèn)題:
兩種訪問(wèn)從access.log中看到,可以說(shuō)完全一樣。但是卻一個(gè)返回444,一個(gè)返回400 。返回444說(shuō)明我的nginx過(guò)濾規(guī)則生效了。而400說(shuō)明沒(méi)有生效。
同時(shí),還需要添加上Host為空的訪問(wèn),將它們進(jìn)行過(guò)濾,例如:
同時(shí),我們也可以檢查靜態(tài)資源是否全部都過(guò)濾的情況,例如我的資源用到了jfif,webp文件。我就需要添加到過(guò)濾規(guī)則中去。
PS:可能存在部分的過(guò)濾失敗,但是整體上來(lái)說(shuō)。提高了網(wǎng)站的安全性,降低了大量的非法請(qǐng)求。
在收獲上來(lái)說(shuō),這一些配置的付出是值得的。
3. 改進(jìn) nginx過(guò)濾規(guī)則
基于發(fā)現(xiàn)的問(wèn)題,再次改進(jìn)access的過(guò)濾規(guī)則。以及非法請(qǐng)求返回444的判斷邏輯。
3.1 修改access_log 記錄
在/etc/nginx/nginx.conf文件中修改如下:
這樣,access文件中就不會(huì)添加ico|gif|jpg|jpeg|png|bmp|swf|js|css|svg|woff|ttf|jfif|webp 作為后綴結(jié)尾的日志內(nèi)容了。
3.2 map實(shí)現(xiàn)爬蟲屏蔽
老版本寫法為:
效率比較低,如果是多個(gè)server那么得寫多遍。所以修改為map的規(guī)則進(jìn)行
但是如果改為map的話,需要在http{}之中先創(chuàng)建map規(guī)則,然后再到server中使用就可以了。示例如下:
語(yǔ)法解釋:
- ~ 表示正則表達(dá)式對(duì)大小寫敏感。
- ~* 表示正則表達(dá)式對(duì)大小寫不敏感。
- 后面跟著的內(nèi)容就是正則表達(dá)式了
- 在正則表達(dá)式中^?代表開(kāi)頭,$?代表結(jié)尾,^$就代表開(kāi)頭和結(jié)尾中間沒(méi)有字符。也就是字符串為空的。
配置完畢后,在需要的server{}段中添加:
因?yàn)樵趎ginx 的if判斷中,參數(shù)值0或者為空字符串,會(huì)判斷為false,其他判斷為true。
而我在上面創(chuàng)建的map對(duì)象中,規(guī)范了,如果匹配就返回1,不匹配返回0。所以if ($zinyanUA)?為true的就是需要返回444的請(qǐng)求了。
如果你出現(xiàn)了這個(gè)if命名錯(cuò)誤的提示,并不是所謂的缺乏if命名的依賴庫(kù),而是Nginx中的if命名和括號(hào)中間需要有空格。
nginx -t? 檢測(cè)通過(guò)后,通過(guò)service nginx reload刷新配置就可以生效了。
PS:如果實(shí)在過(guò)濾不了的,建議直接封IP地址,特別是國(guó)外的訪問(wèn)。國(guó)內(nèi)也有不少的攻擊