使用 GoAccess 分析 Nginx 日誌

運維之美2019-06-24 08:35:43


GoAccess 是一款開源的且具有交互視圖界面的實時 Web 日誌分析工具,通過你的 Web 瀏覽器或者 *nix 系統下的終端程序 (Terminal) 即可訪問。


GoAccess 能為系統管理員提供快速且有價值的 HTTP 訪問統計,並以在線可視化服務器的方式呈現。


GoAccess 官網:https://goaccess.io



安裝 GoAccess


1. 通過包管理器安裝


  • Debian / Ubuntu

$ echo "deb http://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee -a /etc/apt/sources.list.d/goaccess.list$ wget -O - https://deb.goaccess.io/gnugpg.key | sudo apt-key add -$ sudo apt-get update$ sudo apt-get install goaccess


  • Fedora

 $ yum install goaccess


  • Arch Linux

 $ pacman -S goaccess


  • Gentoo

 $ emerge net-analyzer/goaccess


  • OS X / Homebrew

 $ brew install goaccess


2. 通過源代碼安裝


這裏以 CentOS / RHEL 為例,其它版本方法也基本類似,區別在於需安裝依賴軟件包的包名不同而已。


  • 安裝依賴軟件包

$ yum install glib2 glib2-devel GeoIP-devel  ncurses-devel zlib zlib-devel


  • 編譯安裝 GoAccess

$ wget https://tar.goaccess.io/goaccess-1.3.tar.gz$ tar -xzvf goaccess-1.3.tar.gz$ cd goaccess-1.3/$ ./configure --enable-utf8 --enable-geoip=legacy$ make$ make install


更多安裝方式,可參考官方文檔:https://goaccess.io/download#installation


GoAccess 常用命令參數

goaccess -h
-a --agent-list 啟用由主機用户代理的列表。為了更快的解析,不啟用該項。-d --with-output-resolver 在 HTML/JSON 輸出中開啟 IP 解析,會使用 GeoIP 來進行 IP 解析。-f --log-file 需要分析的日誌文件路徑。-p --config-file 配置文件路徑。-o --output 輸出格式,支持。html、json、csv。-m --with-mouse 控制面板支持鼠標點擊。-q --no-query-string 忽略請求的參數部分。--real-time-html 實時生成 HTML 報告。--daemonize 守護進程模式,--real-time-html 時使用。


配置 GoAccess


GoAccess 的主要配置文件為 goaccess.conf,主要配置參數有以下幾項:

time-format %H:%M:%Sdate-format %d/%b/%Ylog-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"


其中的 log-format 與 Nginx 日誌 access.log 中的 log_format 格式對應,每個參數以空格或者製表符分割。參數説明如下:

%t 匹配 time-format 格式的時間字段%d 匹配 date-format 格式的日期字段%h host(客户端 ip 地址,包括 ipv4 和 ipv6)%r 來自客户端的請求行%m 請求的方法%U URL 路徑%H 請求協議%s 服務器響應的狀態碼%b 服務器返回的內容大小%R HTTP 請求頭的 referer字段%u 用户代理的 HTTP 請求報頭%D 請求所花費的時間,單位微秒%T 請求所花費的時間,單位秒%^ 忽略這一字段


使用 GoAccess


基本用法


1. 在終端模式下運行 GoAccess

$ goaccess -a -d -f /var/log/nginx/hi-linux.com.access.log -p /etc/goaccess.conf


第一次使用 GoAccess 的時候,會彈出下面的對話框,要求配置 access_log 的時間和日誌格式。 Nginx 默認的日誌格式就是 NCSA, 所以一般就選第一個就可以了。



日誌格式選中 NCSA Combined Log Format 並回車後, GoAccess 分析日誌完成後會在終端上顯示分析結果。



控制枱下 GoAccess 的操作方法

F1   主幫助頁面F5   重繪主窗口q    退出1-15 跳轉到對應編號的模塊位置 o    打開當前模塊的詳細視圖j    當前模塊向下滾動k    當前模塊向上滾動s    對模塊排序/    在所有模塊中搜索匹配n    查找下一個出現的位置g    移動到第一個模塊頂部G    移動到最後一個模塊底部

2. 在 HTML 模式下運行 GoAccess


默認情況下,GoAccess 是運行在控制枱模式下的,也就是在命令行裏直接輸出結果。


為了更方便的訪問分析結果,我們可以通過 GoAccess 的 HTML 模式將分析結果頁面保存為 HTML,然後通過瀏覽器訪問。


要讓 GoAccess 在 HTML 模式下運行,我們則需要配置下 GoAccess 的配置文件。

$ cat goaccess.conftime-format %H:%M:%Sdate-format %d/%b/%Ylog-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"


  • 通過命令行運行 GoAccess 的 HTML 模式

$ goaccess -a -d -f /var/log/nginx/hi-linux.com.access.log -p /etc/goaccess.conf -o /var/log/nginx/goaccess.html



  • 通過 Daemonize 模式運行 GoAccess 的 HTML 模式


在命令行下運行 GoAccess 的 HTML 模式所產生分析結果文件並不是實時的,如果我們要產生實時的 HTML 分析頁面又應該如何做呢?


GoAccess 已經為我們考慮到這點了,我們可以以 Daemonize 模式來運行,並提供創建實時 HTML 的功能。要實時輸出 HTML 格式的分析結果,只需要在啟動命令時加入 --real-time-html 和 --daemonize 參數即可。

goaccess -a -d -f /var/log/nginx/hi-linux.com.access.log -p /etc/goaccess.conf -o /var/log/nginx/goaccess.html --real-time-html --daemonize


以守護進程啟動 GoAccess 後,使用 Websocket 建立了長連接。它默認監聽 7890 端口,如果需要自定義,可以通過 --port 參數指定端口號。

# 查看 GoAccess 的監聽端口 7890$ netstat -tunpl | grep "goaccess"tcp   0   0 0.0.0.0:7890      0.0.0.0:*     LISTEN      21136/goaccess


  • 通過 Crontab 運行 GoAccess 的 HTML 模式


在某些場景下,也許我們沒有這樣高的實時性要求,也可以採用 Crontab 機制來實現定時更新 HTML 報表。

$ crontab -e# 每 30 分鐘執行30 * * * * goaccess -a -d -f /var/log/nginx/hi-linux.com.access.log -p /etc/goaccess.conf -o /var/log/nginx/goaccess.html 2> /var/log/nginx/goaccess.log


高級用法


  • 讓 GoAccess 支持自定義的日誌格式


GoAccess 也是支持日誌格式定製的,比如現在絕大部分 Nginx 可能都會包括 vhost,即一個物理 Nginx 服務器可以支持多個域名的虛擬主機,但是 Nginx 默認的 NCSA 日誌格式在 /etc/nginx/nginx.conf 配置中是不包括 vhost 字段, 所以我們就無法在報表中區分不同虛擬主機的請求。


Nginx 默認的 NCSA 日誌格式

log_format main '$remote_addr - $remote_user [$time_local] "$request" '                '$status $body_bytes_sent "$http_referer" '                '"$http_user_agent" "$http_x_forwarded_for" ';


為了支持 vhost,可以 Nginx 的 log_format 定製成下面這個樣子, 主要是添加了 $server_name 字段用來顯示 vhost, 還有末尾的 $xxx_time, 用來顯示每個請求的耗時。

log_format main '[$time_local] $remote_addr $server_name "$request" '                '$status $body_bytes_sent "$http_referer" '                '"$http_user_agent" "$http_x_forwarded_for" '                '$upstream_addr $request_time $upstream_response_time';


為了讓 GoAccess 能適配這個格式,需要將 goaccess.conf 中修改成如下格式:

# NCSA Combined Log Formatlog-format %^[%d:%t %^] %h %v "%r" %s %b "%R" "%u"


其中,具體的指示符號可以參考 GoAccess 的官方文檔, 比如 %^ 代表忽略對應的字段。


  • 通過管道讓 GoAccess 更靈活的處理輸入


GoAccess 還可以從管道支持輸入,這樣可以做一些更靈活的處理。比如:access_log 日誌中的 request 字段並不包括 server_name。為了讓 request 能夠包含完整的 url, 我們可以用下面的命令:

$ awk '$6=$4$6' access.log | goaccess -a -


因為 awk 的第 4 列包含了 server_name, 這個命令將 server_name 放到了 request 的前面組成了完整的 url,再將結果用作 GoAccess 的輸入。


參考文檔


https://www.google.com
http://t.cn/RKwsKkv

http://t.cn/E9UFxfF
http://t.cn/E9Usnb1

http://t.cn/E94vqcJ

http://t.cn/E9473TF



推薦閲讀


  • 談談異地多活架構

  • 談談互聯網架構

  • Git 的奇技淫巧

  • 淺談幾種常用負載均衡架構

  • 解讀等級保護制度 2.0 新標準



圖説生活


這裏將分享一些記錄生活的日常隨拍




拍攝於:外灘,上海,2018


https://hk.wxwenku.com/d/200980106