nginx:設置過濾規則,不收納特定主機的日志
1、問題
某些IP(如21.78.41.6、21.78.41.161)一直向本系統發送無效報文,導致error.log出現大量無用報錯日志,如何屏蔽?
2、解決方案
使用map完成對IP打標記(需要過濾的標記為1,放行的標記為0),之后再error_log使用if來讓之前的標記生效。
3、具體配置
http { #1、定義IP過濾規則: #匹配到21.78.41.6、21.78.41.161時,標記為1; #其他IP,標記為0 #這里用一個自定義變量來記錄這個規則 #$disable_error_log的值,當$remote_addr為21.78.41.6和21.78.41.161時,標記為1,其他時候標記為0 map $remote_addr $disable_error_log { default 0; 21.78.41.6 1; 21.78.41.161 1; } #2、動態設置error日志:根據$disable_error_log error_log /var/log/nginx/error.log error if=$disable_error_log; # /var/log/nginx/error.log:正常error日志路徑 # error:日志級別 # if=$disable_error_log:條件判斷:=1時生效(不記錄為日志),=0時正常記錄 }
4、說明
1、map
map是nginx配置文件中特有的指令,專門用于實現“變量映射”功能:根據一個變量的取值,來定義另一個變量的結果。類似鍵值對、K-V對的邏輯
使用位置
map僅存在于Nginx的配置語法中(如nginx.conf),與Linux系統命令、Shell腳本、編程語言、函數均無關系,它只是nginx本身的一項功能。
作用
人為定義一個“映射關系表”,讓Nginx在處理請求時,可以根據某個輸入變量(如客戶端IP $remote_addr、請求域名 $host等)的取值,自動生成另一個輸出變量(該變量為用戶自定義變量,僅作用于該配置文件內)
用法
map $系統變量A $自定義變量B { K1 V1; K2 V2; ... default 0; }
解釋:
當系統變量A取值為K1時,變量B的值置為V1;
當A取值為K2時,B的值置為V2;
……
當A沒匹配到前邊的K1、K2、……時,B置為0。
例子
map $remote_addr $tag{ default 0; 21.78.41.6 1; 192.168.1.0/24 1; 10.0.0.5 1; }
上邊這段的含義是:
當客戶端IP($remote_addr)匹配到21.78.41.6、192.168.1.0/24、10.0.0.5中的任何一個時,就把自定義變量$tag的值置為1,其他時候都將$tag置為1;
所以在我們一開始的例子中:
map $remote_addr $disable_error_log { default 0; 21.78.41.6 1; 21.78.41.161 1; }
含義就是:
disable_error_log的值:當$remote_addr為21.78.41.6和21.78.41.161時,標記為1,其他時候標記為0
2、if
error_log、access_log支持一種使用if進行條件判斷的輕量級句法:
用法
error_log 路徑 級別 if=$變量; access_log 路徑 級別 if=$變量;
解釋
當變量值為0時,該條日志計入到log文件中;其他情況均過濾掉不計入。
所以在一開始的例子中:
#2、動態設置error日志:根據$disable_error_log error_log /var/log/nginx/error.log error if=$disable_error_log;
就是根據之前的自定義變量$disable_error_log的值來決定是否將該條日志錄入log文件。當$disable_error_log為1,也就是根據map規則當客戶端IP為21.78.41.6、161時,日志會被過濾掉,從而實現了一開始的排除某些IP的日志的目的。

浙公網安備 33010602011771號