網站日誌分析最完整實踐

分析網站日誌能夠幫助咱們瞭解用戶地域信息,統計用戶行爲,發現網站缺陷。操做會面臨幾個問題 linux

  • 日誌分析工具splunk如何使用?
  • 日誌格式信息不全,如何配置日誌打印出全面信息?
  • 有大量爬蟲訪問,並不是真實流量,如何去掉這些流量?
  • 若是網站用了CDN加速,反向代理,網關等,日誌打印的是這些設備的ip,那麼用戶的真實ip如何得到呢?

閱讀本文能幫您有效解決上述問題web

splunk

splunk安裝使用

日誌分析工具splunk是一款商業軟件,但有免費版,免費版天天處理日誌限制500M之內。對於簡單分析,500M也能夠挖掘出不少信息了。本文使用免費版splunk分析Apache離線日誌。
先要到splunk官網註冊用戶,註冊用戶填寫的信息除郵箱外不須要真實,公司瞎填便可。註冊完成到下載頁面選擇Linux 64位版本,
網站日誌分析最完整實踐
選擇命令行下載,會給出一個wget的指令,
網站日誌分析最完整實踐
複製wgt指令,到Linux上執行,獲得壓縮包。 (wget指令splunk-8.0.5-xxx的xxx每一個人都不一樣) shell

[root@localhost splunk]# wget -O splunk-8.0.5-xxx-Linux-x86_64.tgz 'https://www.splunk.com/bin/splunk/DownloadActivityServlet?architecture=x86_64&platform=linux&version=8.0.5&product=splunk&filename=splunk-8.0.5-xxx-Linux-x86_64.tgz&wget=true'

解壓壓縮包,到bin目錄下執行 數據庫

./splunk start

看見協議條款按q,是否贊成協議位置輸入y apache

Do you agree with this license? [y/n]: y

用戶名輸入 admin
密碼輸入 adminroot
出現 瀏覽器

The Splunk web interface is at http://192.168.56.106:8000

表示啓動成功。相比於開源工具(ELK,graylog)確實省心太多了。確保Linux防火牆是關閉狀態,而後瀏覽器輸入前面8000地址打開登陸。首次會有引導教程指導如何上傳文件。平常若是想上傳文件,直接點擊左上角splunk->enterprise進入主界面,而後選擇添加數據,
網站日誌分析最完整實踐服務器

有多種添加數據的方式,這裏選擇上載,就是日誌文件已經在我電腦裏了,像上傳附件同樣傳給splunk。過程所有默認,上載文件須要等一段時間。Apache日誌設置「來源類型」時選擇web裏的access_combined。
網站日誌分析最完整實踐cookie

下一步,「檢查」,「提交」都是默認。顯示文件上載成功,點擊「開始搜索」按鈕,搜索剛纔上傳的日誌數據。
網站日誌分析最完整實踐運維

搜索框是放搜索限制條件的,右下方是原始日誌,左側是各個字段的名稱,這些字段是工具內置的,知足格式的日誌會自動被解析出這些字段,好比每條日誌開頭都有個客戶端的ip,就是左側的clientip,鼠標點擊clientip會看見統計結果,默認是出現頻率最高的前10個ip。若是要統計更多,須要在搜索框用對應語法查詢。
網站日誌分析最完整實踐dom

splunk搜索語言介紹(SPL語法)

語法用於在搜索框中使用,達到限制範圍,統計所須要指標的目的。語法像「搜索引擎 + SQL + shell」的混合體。若是能熟練運用功能很是強大。

  • 基本語法,

    source="access2020-09-11.log" host="basicserver" sourcetype="access_combined"

    source表示數據來源文件名,host是splunk所在的主機名稱,sourcetype是導入時配置的。這些均可以變換,我想統計10號的數據,將access2020-09-10.log做爲source就達到了效果。若是想查看basicserver裏的全部數據不分日期,把source條件去掉,只保留host和sourcetype兩個條件。搜索框最少要有一個條件。

  • 訪問頻率最高的200個ip
    host="basicserver" | top clientip limit=200
  • 客戶端ip的地理信息
    host="basicserver" | iplocation clientip

    執行後左側下方「感興趣的字段」會比剛纔多出City Country Region字段,這些和客戶端ip的地理位置是對應的。

  • 訪問頻率最高的十個城市
    host="basicserver" | iplocation clientip | top City limit=10
  • 地圖查看ip分佈

    host="basicserver" | iplocation clientip |  geostats count

    網站日誌分析最完整實踐

  • 有多少不一樣的ip訪問網站
    host="basicserver"   | stats dc(clientip)
  • 全部日誌記錄按時間正序排列
    host="basicserver" | sort _time

    默認按照倒序,最新的日誌排在最前面

  • 訪問次數最少的ip
    host="basicserver" | rare clientip
  • 被訪問最多的uri
    host="basicserver" | top uri limit=20
  • clientip不等於某兩個網段的記錄
    host=basicserver clientip!="158.111.2.*"  clientip!="192.190.2.*"

    補充一句,搜索框能夠輸入不少條件,條件增多搜索框會隨着變大,不要擔憂條件多裝不下。

數據可視化

搜索欄下方依次有 事件、模式、統計信息、可視化 選項,最後的可視化選項能生成圖表,最好是在搜索命令計算了某個統計指標,而後點擊可視化。若是沒計算指標直接點擊可視化,配置會比較繁瑣才能生成圖表。
假設搜索欄統計某天訪問次數最高的20個clientip,命令爲

source="access2020-09-11.log" | top clientip limit=20

執行完會在統計信息下方列出前20個ip,點擊可視化,選擇柱狀圖。
網站日誌分析最完整實踐

柱狀圖出來後,點擊格式能夠配置讓座標ip豎着顯示,看着更舒服。
網站日誌分析最完整實踐

ip地址的地理信息數據庫如何更新

統計ip的地理位置依賴於地理信息庫,安裝時有個內置的庫,不是最新的。若是要更新到最新的須要到https://dev.maxmind.com/zh-hans/geoip/geoip2/geolite2/下載最新的GeoLite2-City.mmdb(要先註冊),把這個文件複製到splunk/share目錄下覆蓋原來的同名文件便可。

刪除數據

刪除全部數據./splunk clean eventdata -f
刪除屬於索引indexname的數據 ./splunk clean eventdata -index indexname -f

Apache日誌須要注意的

common和combined兩種格式

日誌格式有common和combined兩種格式,combined格式信息更全面,比common格式多了refer和useragent信息。下面是apache/conf下的httpd.conf文件裏對兩種格式的定義

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common

若是common日誌知足不了分析要求,能夠把格式改爲common格式。方法是修改apache/conf下的httpd.conf文件,把裏面CustomLog末尾配置爲combined

CustomLog "|/opt/apache/bin/rotatelogs /opt/apache/logs/access%Y-%m-%d.log 86400" combined

沒法直接看到用戶真實ip怎麼辦

若是網站前方有反向代理或者網關,或者網站作了CDN加速,那麼日誌的clientip是代理服務器、網關或者CDN加速服務器的ip,沒什麼分析價值。
網站日誌分析最完整實踐

要獲取用戶真實ip能夠修改httpd.conf的LogFormat,加上%{X-FORWARDED-FOR}i (簡稱XFF),我直接將XFF加到了%h的後面,

LogFormat "%h %{X-FORWARDED-FOR}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %{X-FORWARDED-FOR}i %l %u %t \"%r\" %>s %b" common

假設網站有CDN加速(其它狀況同理分析),按上面格式,每條日誌首先打印的是CDN加速服務器ip,而後是XFF的ip(也就是用戶真實ip)。若是用戶沒有通過CDN直接訪問,那麼XFF就是一條橫線"-"。
網站日誌分析最完整實踐

Apache動態載入配置文件

修改完配置文件,不須要重啓Apache,到Apache/bin下執行./apachectl graceful能夠動態載入配置文件,不中止服務,新的配置馬上生效。

splunk如何解析XFF字段

splunk內置的access_combined和access_common格式都沒法解析XFF,若是要正確解析須要修改splunk/etc/system/default/transforms.conf
新增[xff]段配置XFF的正則

[xff]
REGEX = \d{1,3}(\.\d{1,3}){2,3}

修改[access-extractions]段,在clientip後增長([[nspaces:xff]]\s++)?,用來匹配XFF

[access-extractions]
REGEX = ^[[nspaces:clientip]]\s++([[nspaces:xff]]\s++)?[[nspaces:ident]]\s++[[nspaces:user]]\s++[[sbstring:req_time]]\s++[[access-request]]\s++[[nspaces:status]]\s++[[nspaces:bytes]](?:\s++"(?<referer>[[bc_domain:referer_]]?+[^"]*+)"(?:\s++[[qstring:useragent]](?:\s++[[qstring:cookie]])?+)?+)?[[all:other]]

[xff]段的位置不重要,寫在哪裏都行。配置完成,重啓splunk,上傳帶有XFF的日誌,左側會看見「感興趣的字段」出現了xff
網站日誌分析最完整實踐

xff字段的分析統計和clientip徹底同樣,只不過這是真實用戶的ip了。

如何對付爬蟲

經過分析日誌,下列行爲能夠判斷爲爬蟲

  • 該ip訪問佔比特高
  • useragent明確說本身是哪家搜索引擎爬蟲
  • 訪問的uri明顯不須要那麼頻繁訪問
  • 非必要的凌晨訪問(不睡覺嗎?)
  • 訪問頻率高(兩分鐘訪問上千個url)

搜索引擎的爬蟲訪問網站是爲了收錄網站數據。有一些惡意的爬蟲會作壞事,除了抓數據還嘗試登錄執行腳本等。爬蟲訪問的頻率都很高會給網站帶來負載,應該根據網站狀況進行不一樣程度的限制。限制惡意爬蟲只能封對方ip。搜索引擎的爬蟲能夠經過配置robots.txt文件,以及在該引擎的站長平臺配置或投訴來限制。

robots.txt

搜索引擎抓取數據會先讀取網站根目錄下的robots.txt文件,文件根據robots協議書寫規則,文件的規則就是搜索引擎要遵照的規則。好比打開https://www.taobao.com/robots.txt
能夠看到淘寶的協議規定百度爬蟲任何數據都不能夠爬。

User-agent: Baiduspider
Disallow: /

若是要任何爬蟲都不能爬任何數據,就寫成

User-agent: *
Disallow: /

複雜的規則如指定引擎能夠爬取某些目錄,某些目錄不能夠爬,robots協議也是支持的。
robots協議是「君子協定」,它並無經過技術手段限制爬蟲,要靠爬蟲的自覺遵照。
按我經驗,百度、谷歌、360、字節、都能遵照協議,搜狗很流氓,不遵照協議。

有些請求的useragent寫的是Baiduspider,但多是冒充百度爬蟲,useragent是能夠本身設置的。要想判斷一個ip是不是搜索引擎的爬蟲可使用,nslookup或者host命令。這兩個命令返回的域名信息能夠看出來是不是爬蟲。

# nslookup 49.7.21.76
Server:         219.141.136.10
Address:        219.141.136.10#53
Non-authoritative answer:
76.21.7.49.in-addr.arpa name = sogouspider-49-7-21-76.crawl.sogou.com.

# host 111.206.198.69
69.198.206.111.in-addr.arpa domain name pointer baiduspider-111-206-198-69.crawl.baidu.com.

另外,各大搜索引擎的站長平臺會教如何判斷ip是不是本身的爬蟲,百度站長平臺就有「輕鬆兩步,教你快速識別百度蜘蛛」,介紹了百度蜘蛛useragent的格式和判斷方法。

站長平臺

搜索引擎都有站長平臺,裏面有不少相關的教程幫助更好的使用搜索引擎。註冊站長平臺時要證實本身有網站的管理權限,驗證方法是能夠將指定文件放置到網站根目錄。成爲站長後能夠查詢本身網站的索引收錄狀況,查詢搜索引擎給網站帶來的流量等指標。還能夠投訴爬蟲抓取頻繁,設定抓取頻率。有些平臺公佈郵箱能夠投訴。

封IP

對於惡意或者不遵照robots協議的爬蟲,只能封ip。網站源站用防火牆來封,CDN加速服務器也都提供了封ip功能。配置了CDN加速的網站必定要封xff的IP,由於大部分clientip都是CDN加速服務器的地址,封了這些地址不少正經常使用戶就不能正常訪問了。

總結

日誌分析是從理性方面瞭解系統,分析結果可能會顛覆以前對系統的固有認知。對開發,運維,運營都能提供有價值的信息,建議你們有機會嘗試一下。若是不想封禁爬蟲ip,能夠在搜索欄排除爬蟲ip的訪問記錄(xff!="爬蟲ip"),這樣既能排除干擾,還能和爬蟲和平共處。

相關文章
相關標籤/搜索