GoAccess分析Web日誌
阿新 • • 發佈:2020-06-21
#### 簡介
##### 為什麼要用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。
- 關鍵字: 報告支援用在谷歌搜尋,谷歌快取,谷歌翻譯上使用關鍵字。目前僅支援通過 HTTP 使用谷歌搜尋。 可以在配置檔案中通過 `--ignore-panel` 開啟此功能。(預設關閉)
- 地理位置: 根據 IP 地址判斷地理位置。統計資料按照大洲和國家分組。需要地理位置模組的支援。
- HTTP 狀態碼: 以數字表示的 HTTP 請求的狀態編碼。
- 遠端使用者(HTTP驗證) 通過 HTTP 驗證來確定訪問文件的許可權。如果文件沒有被密碼保護起來,這部分將會顯示為 “-”。此面板預設為開啟,除非在日誌格式變數中設定了引數 %e 。
注意: 如果配置了可選項,所有面板將顯示處理請求的平均時間消耗。
##### 儲存方式
`GoAccess 支援三種類型的儲存方式。請根據你的需要和系統環境進行選擇。`
- 預設雜湊表
記憶體雜湊表可以提供較好的效能,缺點是資料集的大小受限於實體記憶體的大小。GoAccess 預設使用記憶體雜湊表。如果你的記憶體可以裝下你的資料集,那麼這種模式的表現非常棒。此模式具有非常好的記憶體利用率和效能表現。
- Tokyo Cabinet 磁碟 B+ 樹
使用這種模式來處理巨大的資料集,大到不可能在記憶體中完成任務。當資料提交到磁碟以後,B+樹資料庫比任何一種雜湊資料庫都要慢。但是,使用 SSD 可以極大的提高效能。往後您可能需要快速載入儲存的資料,那麼這種方式就可以被使用。
- Tokyo Cabinet 記憶體雜湊表
作為預設雜湊表的替換方案。因為使用通用型別在記憶體表現以及速度方面都很平均。
#### 部署
##### 初始化環境
```python
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 http://mirrors.163.com/.help/CentOS7-Base-163.repo &>/dev/null
curl -o /etc/yum.repos.d/epel.repo http://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
```python
#安裝依賴包
yum -y install glib2 glib2-devel ncurses ncurses-devel GeoIP GeoIP-devel GeoIP-data openssl-devel
wget https://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= 地理位置支援。依賴 MaxMind GeoIP 模組。 legacy 將使用原始 GeoIP 資料庫。 mmdb 將使用增強版 GeoIP2 資料庫。
# --enable-tcb=
# 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
```python
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
```python
cat /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://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常用引數
```python
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=http://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=
# 建立一個管道(先入先出)從指定的路徑/檔案讀取資料。
--fifo-out=
# 建立一個管道(先入先出)往指定的路徑/檔案寫入資料。
--ssl-cert=
# 指定 TLS/SSL 證書的路徑。使 GoAccess 支援 TLS/SSL,需要使用引數 --ssl-cert 和 --ssl-key。
# 僅在使用了引數 --with-openssl 時有效
--ssl-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
# 排除一個 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=
HTTP 請求協議開關。將建立一個請求欄位包含請求協議+真實請求。
-M --http-method=
# HTTP 請求方法開關。將建立一個請求欄位包含請求方法+真實請求。
-o --output=
# 將給定檔案重定向到標準輸出,通過後綴名決定輸出格式:
/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=
# 設定日期的顯示格式,一種是標準日期格式(預設),一種是日期後附加小時的格式。
# 僅在訪客面板有效。對於在小時級別分析訪客資料很有幫助。顯示格式示例: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
```python
# 匯入訪問日誌
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,稍等片刻就會出現下面圖形
```
![](https://img2020.cnblogs.com/blog/1871335/202006/1871335-20200621010025710-649601339.png)
##### 不同的輸出
```python
# 輸出到終端且生成一個可互動的報告:
# 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 報告,因為它是由沒有外部檔案依賴的單個檔案組成,是不是很酷!*
```python
# 生成實時 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= 和 --ssl-key=。
`