在我們日常的運維中,當Nginx服務器正常運行后,我們會經常密切關注Nginx訪問日志的相關情況,發現有異常的日志信息需要進行及時處理。
那今天我將跟大家一起來研究和分析Nginx日志,nginx默認日志路徑為:/usr/local/nginx/logs/access.log 和error.log文件。如下圖查看nginx日志:cat access.log |more
Nginx日志的格式一般在nginx.conf里面配置,常見的格式配置如下:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
格式說明:
$remote_addr, $http_x_forwarded_for 記錄客戶端IP地址
$remote_user 記錄客戶端用戶名稱
$request 記錄請求的URL和HTTP協議
$status 記錄請求狀態
$body_bytes_sent 發送給客戶端的字節數,不包括響應頭的大小; 該變量與Apache模塊mod_log_config里的“%B”參數兼容。
$bytes_sent 發送給客戶端的總字節數。
$connection_requests 當前通過一個連接獲得的請求數量。
$http_referer 記錄從哪個頁面鏈接訪問過來的
$http_user_agent 記錄客戶端瀏覽器相關信息
$request_length 請求的長度(包括請求行,請求頭和請求正文)。
$request_time 請求處理時間,單位為秒,精度毫秒; 從讀入客戶端的第一個字節開始,直到把最后一個字符發送給客戶端后進行日志寫入為止。
Nginx日志分析需求:
1) 分析截止目前為止訪問量最高的IP排行。
awk '{print $1}' /usr/local/nginx/logs/access.log|sort |uniq -c |sort -nr |head -20
2) 分析從早上9點至中午12點總的訪問量。
3) 分析上一秒的訪問請求數。
4) 找到當前日志中502或者404錯誤的頁面並統計。
awk '{print $0}' /usr/local/nginx/logs/access.log|egrep "404|502"|awk '{print $1,$7,$9}'|more
通過編寫腳本實現自動分析Nginx異常訪問並加入防火牆:
1) 首先要判斷什么是惡意訪問呢?
我們可以定義為每秒請求一個URL超過20次的IP都可以封掉哦。
#!/bin/sh