GoAccess分析Web日誌

簡介

為什麼要用GoAccess?

GoAccess 被設計成快速的並基於終端的日誌分析工具。其核心理念是不需要通過 Web 瀏覽器就能快速分析並實時查看 Web 伺服器的統計數據(這對於需要使用 SSH 來對訪問日誌進行快速分析或者就是喜歡在終端環境下工作的人來說是超贊的)。

終端輸出僅僅是默認的輸出方式,GoAccess 還支援生成完整的實時 HTML 報告(這對分析、監控以及數據可視化都是極好的),以及 JSON 和 CSV 格式的報告。

功能如下

  • 通用統計: 此面板展示了幾個主要指標,比如:有效和無效請求的數量,分析這些數據所花費的時間,獨立訪客的情況,請求的文件,靜態文件(CSS, ICO, JPG 等)的完整URL,404錯誤,被解析的日誌文件的大小以及消耗的頻寬。
  • 獨立訪客: 此面板按照日期展示了訪問次數,獨立訪客數,以及累計消耗的頻寬等指標。具有相同IP,相同訪問時間,相同的 UserAgent 的 HTTP 請求將會被識別為獨立訪客。默認情況下包含了網路爬蟲。
    您也可以選擇使用 –date-spec=hr 參數將按照日期分析修改為按照小時,例如:05/Jun/2016:16 。這對於希望在小時級別去跟蹤每日流量非常有幫助。
  • 請求的文件: 此面板展示您伺服器上被請求次數最多的文件。包含訪問次數,獨立訪客數,百分比,累計消耗頻寬,使用的協議,請求方式。
    請求的靜態文件: 列出請求頻率最高的靜態文件類型,例如: JPG, CSS, SWF, JS, GIF, 和 PNG , 以及和上一個面板一樣的其他指標。 另外靜態文件可以被添加到配置文件中。
    404 或者文件未找到: 展示內容與之前的面板類似,但是其數據包含了所有未找到的頁面,以及俗稱的 404 狀態碼。
  • 主機: 此面板展示主機自身的詳細資訊。能夠很好的發現不懷好意的爬蟲以及識別出是誰吃掉了你的頻寬。
    擴展面板將向您展示更多資訊,比如主機的反向DNS解析結果,主機所在國家和城市。如果開啟了 參數,選擇想查看的 IP 地址並按回車,將會顯示 UserAgent 列表。
  • 作業系統: 此面板將顯示主機使用的作業系統的資訊。GoAccess 將儘可能嘗試為每一款作業系統提供詳細的資訊。
  • 瀏覽器: 此面板將顯示來訪主機使用的瀏覽器資訊。GoAccess 將儘可能嘗試為每一款瀏覽器提供詳細的資訊。
  • 訪問次數: 此面板按小時報告。因此將顯示24個數據點,每一個均對應每一天的某一個小時。
    使用 –hour-spec=min 參數可以設定為按每十分鐘報告,並將以 16:4 的格式顯示時間。這對發現伺服器的峰值訪問時段很有幫助。
  • 虛擬主機: 此面板將顯示從訪問日誌中解析出來的不同的虛擬主機的情況。此面板僅在日誌格式中啟用了 %v 參數時顯示。
  • 來路URL: 如果問題主機通過其他的資源訪問了你的站點,以及通過從其他主機上的鏈接或者跳轉到你的站點,則這些來路URL將會被顯示在此面板。可以在配置文件中通過 --ignore-panel 開啟此功能。(默認關閉)
  • 來路站點: 此面板將僅顯示主機的部分,而不是完整的URL。
  • 關鍵字: 報告支援用在Google搜索,Google快取,Google翻譯上使用關鍵字。目前僅支援通過 HTTP 使用Google搜索。 可以在配置文件中通過 --ignore-panel 開啟此功能。(默認關閉)
  • 地理位置: 根據 IP 地址判斷地理位置。統計數據按照大洲和國家分組。需要地理位置模組的支援。
  • HTTP 狀態碼: 以數字表示的 HTTP 請求的狀態編碼。
  • 遠程用戶(HTTP驗證) 通過 HTTP 驗證來確定訪問文檔的許可權。如果文檔沒有被密碼保護起來,這部分將會顯示為 「-」。此面板默認為開啟,除非在日誌格式變數中設置了參數 %e 。
    注意: 如果配置了可選項,所有面板將顯示處理請求的平均時間消耗。
存儲方式

GoAccess 支援三種類型的存儲方式。請根據你的需要和系統環境進行選擇。

  • 默認哈希表
    記憶體哈希表可以提供較好的性能,缺點是數據集的大小受限於物理記憶體的大小。GoAccess 默認使用記憶體哈希表。如果你的記憶體可以裝下你的數據集,那麼這種模式的表現非常棒。此模式具有非常好的記憶體利用率和性能表現。
  • Tokyo Cabinet 磁碟 B+ 樹
    使用這種模式來處理巨大的數據集,大到不可能在記憶體中完成任務。當數據提交到磁碟以後,B+樹資料庫比任何一種哈希資料庫都要慢。但是,使用 SSD 可以極大的提高性能。往後您可能需要快速載入保存的數據,那麼這種方式就可以被使用。
  • Tokyo Cabinet 記憶體哈希表
    作為默認哈希表的替換方案。因為使用通用類型在記憶體表現以及速度方面都很平均。

部署

初始化環境
init_security() {
systemctl stop firewalld
systemctl disable firewalld &>/dev/null
setenforce 0
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
sed -i '/^GSSAPIAu/ s/yes/no/' /etc/ssh/sshd_config
sed -i '/^#UseDNS/ {s/^#//;s/yes/no/}' /etc/ssh/sshd_config
systemctl enable sshd crond &> /dev/null
echo -e "\033[32m [安全配置] ==> OK \033[0m"
}

init_yumsource() {
if [ ! -d /etc/yum.repos.d/backup ];then
mkdir /etc/yum.repos.d/backup
fi
mv /etc/yum.repos.d/* /etc/yum.repos.d/backup 2>/dev/null
if ! ping -c2 www.baidu.com &>/dev/null
then
echo "您無法上外網,不能配置yum源"
exit
fi
curl -o /etc/yum.repos.d/163.repo //mirrors.163.com/.help/CentOS7-Base-163.repo &>/dev/null
curl -o /etc/yum.repos.d/epel.repo //mirrors.aliyun.com/repo/epel-7.repo &>/dev/null
timedatectl set-timezone Asia/Shanghai
echo "nameserver 114.114.114.114" > /etc/resolv.conf
echo "nameserver 8.8.8.8" >> /etc/resolv.conf
chattr +i /etc/resolv.conf
echo -e "\033[32m [YUM Source] ==> OK \033[0m"
}
部署GoAccess
#安裝依賴包
yum -y install glib2 glib2-devel ncurses ncurses-devel GeoIP GeoIP-devel GeoIP-data openssl-devel
wget //tar.goaccess.io/goaccess-1.3.tar.gz

tar xf goaccess-1.3.tar.gz -C /usr/local/src/
cd goaccess-1.3
./configure --prefix=/usr/local/goaccess1.3 --enable-utf8 --enable-geoip=legacy --with-openssl


# --enable-debug  使用調試標誌編譯且關閉編譯器優化。
# --enable-utf8   寬字元支援。依賴 Ncursesw 模組。
# --enable-geoip=<legacy|mmdb>  地理位置支援。依賴 MaxMind GeoIP 模組。 legacy 將使用原始 GeoIP 資料庫。 mmdb 將使用增強版 GeoIP2 資料庫。
# --enable-tcb=<memhash|btree>
# Tokyo Cabinet 存儲支援。 memhash 將使用 Tokyo Cabinet 的記憶體哈希資料庫。btree 將使用 Tokyo Cabinet 的磁碟 B+Tree 資料庫。
# --disable-zlib  禁止在 B+Tree 資料庫上使用 zlib 壓縮。
# --disable-bzip  禁止在 B+Tree 資料庫上使用 bzip2 壓縮。
# --with-getline  使用動態擴展行緩衝區用來解析完整的行請求,否則將使用固定大小(4096)的緩衝區。
# --with-openssl  使 GoAccess 與其 WebSocket 伺服器之間的通訊能夠支援 OpenSSL。

make && make install
ln -s /usr/local/goaccess1.3/ /usr/local/goaccess

echo "export PATH=/usr/local/goaccess/bin:$PATH" >>/etc/profile
source /etc/profile
配置GoAccess
vim /usr/local/goaccess/etc/goaccess/goaccess.conf
time-format %T
date-format %d/%b/%Y
log-format %h - %^ [%d:%t %^]; "%r" %s %b "%R" - %^"%u" - %^ %T

# 配置文件參數說明
# -time-format
# 參數 time-format 後跟隨一個空格符,指定日誌的時間格式,包含普通字元與特殊格式說明符的任意組合。他們都由百分號 (%)開始。參考 man strftime。 %T 或者 %H:%M:%S.

# -date-format
# 參數 date-format 後跟隨一個空格符,指定日誌的日期格式,包含普通字元與特殊格式說明符的任意組合。他們都由百分號 (%)開始。參考 man strftime。

# -log-format
# 參數 log-format 後跟隨一個空格符或者製表分隔符(\t),用於指定日誌字元串格式

%x 匹配 time-format 和 date-format 變數的日期和時間欄位。用於使用時間戳來代替日期和時間兩個獨立變數的場景。
%t 匹配 time-format 變數的時間欄位。
%d 匹配 date-format 變數的日期欄位。
%v 根據 canonical 名稱設定的伺服器名稱(服務區或者虛擬主機)。
%e 請求文檔時由 HTTP 驗證決定的用戶 ID。
%h 主機(客戶端IP地址,IPv4 或者 IPv6)。
%r 客戶端請求的行數。這些請求使用分隔符(單引號,雙引號)引用的部分可以被解析。否則,需要使用由特殊格式說明符(例如:%m, %U, %q 和 %H)組合格式去解析獨立的欄位。
注意: 既可以使用 %r 獲取完整的請求,也可以使用 %m, %U, %q and %H 去組合你的請求,但是不能同時使用。
%m 請求的方法。
%U 請求的 URL。
注意: 如果查詢字元串在 %U中,則無需使用 %q。但是,如果 URL 路徑中沒有包含任何查詢字元串,則你可以使用 %q 查詢字元串將附加在請求後面。
%q 查詢字元串。
%H 請求協議。
%s 伺服器回傳客戶端的狀態碼。
%b 回傳客戶端的對象的大小。
%R HTTP 請求的 "Referer" 值。
%u HTTP 請求的 "UserAgent" 值。
%D 處理請求的時間消耗,使用微秒計算。
%T 處理請求的時間消耗,使用帶秒和毫秒計算。
%L 處理請求的時間消耗,使用十進位數表示的毫秒計算。
%^ 忽略此欄位。
%~ 繼續解析日誌字元串直到找到一個非空字元(!isspace)。
~h 在 X-Forwarded-For (XFF) 欄位中的主機(客戶端 IP 地址,IPv4 或者 IPv6)。
部署Nginx
cat /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=//nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=//nginx.org/keys/nginx_signing.key
module_hotfixes=true

yum -y instal nginx


# 配置Nginx日誌格式
vim /etc/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" $upstream_addr $request_time';

systemctl start nginx

使用

GoAccess常用參數
goaccess有控制台模式和html靜態頁面模式,這裡先介紹一下控制台模式

goaccess -a -d -f logs/access_web.log -p /usr/local/goaccess/etc/goaccess/goaccess.conf

#常用參數
--addr=
# 將伺服器綁定到指定 IP 地址。默認綁定到 0.0.0.0 。
通常無需指定,除非您希望將伺服器綁定到主機上的其他地址。

--daemonize
# 使 GoAccess 作為守護程式運行(僅在 --real-time-html 開啟下有效)。

--origin=
# E在 WebSocket 握手中確保客戶端發送指定的源頭。且指定的源應與瀏覽器發送源頭欄位完全相同。例如:--origin=//goaccess.io

--port=
# 指定服務使用的埠。GoAccess 默認使用埠 7890 作為 WebSocket 伺服器。請確保此埠可用。

--real-time-html
# 使能實時 HTML 報告。

--ws-url=<[scheme://]url[:port]>
# 此 URL 用於 WebSocket 伺服器的回應。用於客戶端側的 WebSocket 構建器。
# 同時可以選擇指定 WebSocket 的 URI 協議,比如:ws:// 用於非加密連接, 以及 wss:// 用於加密連接。示例:wss://goaccess.io
# 如果 GoAccess 運行在代理伺服器的後面,您需要通過在主機名後跟隨冒號加埠號的方式讓客戶端連接到另外一個不同的埠。示例:goaccess.io:9999
# 默認情況下,會嘗試去連接生成報告的主機名。如果 GoAccess 運行在一台遠程伺服器上,則遠程主機名也應該在 URL 中指定。當然,必須保證主機是有效的。

--fifo-in=<path/file>
# 創建一個管道(先入先出)從指定的路徑/文件讀取數據。

--fifo-out=<path/file>
# 創建一個管道(先入先出)往指定的路徑/文件寫入數據。

--ssl-cert=<path/cert.crt>
# 指定 TLS/SSL 證書的路徑。使 GoAccess 支援 TLS/SSL,需要使用參數 --ssl-cert 和 --ssl-key。
# 僅在使用了參數 --with-openssl 時有效

--ssl-key=<path/priv.key>
# 指定 TLS/SSL 私鑰的路徑。使 GoAccess 支援 TLS/SSL,需要使用參數 --ssl-cert 和 --ssl-key。
# 僅在使用了參數 --with-openssl 時有效

1.24 FILE OPTIONS
-f --log-file=
# 指定輸入日誌文件的路徑。如果在配置文件中指定了輸入文件,則其優先順序要高於在命令行中通過 -f 參數指定。

-l --log-debug=
# 發送所有調試資訊到指定文件。需要指定配置選項 --enable-debug

-p --config-file=
# 指定使用自定義配置文件。如果設置了此參數,其優先順序將高於全局配置文件(如果有)。

--invalid-requests=
# 記錄無效請求到指定文件。

--no-global-config
# 禁止載入全局配置文件。可能的目錄應該是 /usr/etc/, /etc/ 或者 /usr/local/etc/, 除非在運行 ./configure 時指定了 --sysconfdir=/dir 。


-a --agent-list
# 開啟 UserAgent 列表。開啟後會降低解析速度。

-d --with-output-resolver
# 輸出 HTML 或者 JSON 報告時開啟 IP 解析。

-e --exclude-ip <IP|IP-range>
# 排除一個 IPv4 或者 IPv6 地址。 使用連接符表示 IP 段(開始-結束)。

exclude-ip 127.0.0.1
exclude-ip 192.168.0.1-192.168.0.100
exclude-ip ::1
exclude-ip 0:0:0:0:0:ffff:808:804-0:0:0:0:0:ffff:808:808
-H --http-protocol=<yes|no>
HTTP 請求協議開關。將創建一個請求欄位包含請求協議+真實請求。

-M --http-method=<yes|no>
# HTTP 請求方法開關。將創建一個請求欄位包含請求方法+真實請求。

-o --output=<json|csv>
# 將給定文件重定向到標準輸出,通過後綴名決定輸出格式:
/path/file.csv - Comma-separated values (CSV)
/path/file.json - JSON (JavaScript Object Notation)
/path/file.html - HTML
-q --no-query-string
# 忽略請求的查詢字元串。即: www.google.com/page.htm?query => www.google.com/page.htm
# 注意: 去掉查詢字元串將極大降低記憶體消耗,特別對帶時間戳的請求。

-r --no-term-resolver
# 在終端輸出時禁止 IP 解析。

--444-as-404
# 將非標準狀態 444 作為 404 處理。

--4xx-to-unique-count
# 將 4xx 客戶端錯誤數加到獨立訪客數中。

--all-static-files
# 統計包含查詢字元串的靜態文件。

--date-spec=<date|hr>
# 設置日期的顯示格式,一種是標準日期格式(默認),一種是日期後附加小時的格式。
# 僅在訪客面板有效。對於在小時級別分析訪客數據很有幫助。顯示格式示例:18/Dec/2010:19

--double-decode
# 解碼雙重編碼的值。包括 UserAgent,Request 以及 Referer。

--enable-panel=
# 開啟指定面板。面板列表

控制台操作方法
F1   主幫助頁面
F5   重繪主窗口
q    退出
1-15 跳轉到對應編號的模組位置
o    打開當前模組的詳細視圖
j    當前模組向下滾動
k    當前模組向上滾動
s    對模組排序
/    在所有模組中搜索匹配
n    查找下一個出現的位置
g    移動到第一個模組頂部
G    移動到最後一個模組底部
配置nginx域名訪問goaccess
# 導入訪問日誌
goaccess -f /var/log/nginx/access.log --log-format=COMBINED -a -o /usr/local/nginx/html/index.html
vim /usr/local/nginx/conf/goaccess.conf
server  { 
        listen  7890;
        server_name 39.108.140.0;
        location / {
          root  /usr/local/nginx/html;
          try_files  $uri  $uri/  /index.html;
       }
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
}

# 訪問IP:7890,稍等片刻就會出現下面圖形

不同的輸出
# 輸出到終端且生成一個可交互的報告:
# goaccess access.log

# 生成一份 HTML 報告:
# goaccess access.log -a -o report.html

# 生成一份 JSON 報告:
# goaccess access.log -a -d -o report.json

# 生成一份 CSV 文件:
# goaccess access.log --no-csv-summary -o report.csv

# GoAccess 非常靈活,支援實時解析和過濾。例如:需要通過監控實時日誌來快速診斷問題:
# tail -f access.log | goaccess -

# 更厲害的是,還可以使用 tail -f 和一個模式匹配工具一起工作,比如: grep, awk, sed 等等
# tail -f access.log | grep -i --line-buffered 'firefox' | goaccess --log-format=COMBINED -

# 又或者可以在管道打開的狀態下從頭開始解析文件,並同時應用一個過濾器:
# tail -f -n +0 access.log | grep --line-buffered 'Firefox' | goaccess -o out.html --real-time-html -
實時HTML輸出

GoAccess 有能力在 HTML 報告中展示實時數據。您甚至可以通過電子郵件發送 HTML 報告,因為它是由沒有外部文件依賴的單個文件組成,是不是很酷!

# 生成實時 HTML 報告的過程和生成靜態報告的過程非常相似。實時報告僅僅需要使用參數 --real-time-html 。
# goaccess access.log -o /usr/share/nginx/html/site/report.html --real-time-html

# GoAccess 默認使用生成報告的主機名。您也可以指定 URL 用於客戶端瀏覽器訪問。參考 FAQ 上更詳細的示例。
 # goaccess access.log -o report.html --real-time-html --ws-url=goaccess.io

# GoAccess 默認偵聽埠 7890,如下使用其他埠可以這樣操作(確保埠已經打開):
# goaccess access.log -o report.html --real-time-html --port=9870

# 綁定 WebSocket 伺服器到不同於 0.0.0.0 的另外一個地址,可以這樣操作:
# goaccess access.log -o report.html --real-time-html --addr=127.0.0.1
# 注意: 如果需要在加密連接上輸出實時數據,則需要使用 --ssl-cert=<cert.crt> 和 --ssl-key=<priv.key>。