使用GoAccess分析Nginx日誌

首發於 樊浩柏科學院html

爲了查看本站點的健康情況以及用戶訪問狀況,就須要按期的分析服務器的 access 日誌。可是因爲沒有使用日誌分析工具,只能使用 cat、awk、sed 等命令作一些簡單的日誌分析統計,這樣分析結果不理想也不全面,方法也極不高效。做爲我的站點更適合引入輕量級的日誌分析工具,例如 GoAccess ,其使用簡單且分析效果較好,見這裏nginx

Nginx配置

爲了提升 GoAccess 分析準確度,須要配置 nginx.conf 的 log_format 項。json

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

安裝GoAccess

安裝詳見 GoAccess 文檔服務器

$ wget http://tar.goaccess.io/goaccess-1.2.tar.gz
$ tar -xzvf goaccess-1.2.tar.gz
$ cd goaccess-1.2/
# --with-openssl項開啓openssl,HTTPS時須要
$ ./configure --enable-utf8 --enable-geoip=legacy --with-openssl
$ make
$ make install

在 configure 的時候可能會由於缺乏一些依賴而失敗。例如:架構

checking for GeoIP_new in -lGeoIP... no
configure: error: 
    *** Missing development files for the GeoIP library

此時,根據提示安裝對應依賴便可。hexo

$ yum install GeoIP-devel
# 或者安裝所有依賴
$ yum install glib2 glib2-devel GeoIP-devel  ncurses-devel zlib zlib-devel

配置

安裝完成後,默認將配置文件goaccess.conf放置於/usr/local/etc路徑,爲了統一管理,使用mv /usr/local/etc/goaccess.conf /etc/命令將其移動到/etc目錄下。dom

對配置文件作一些主要配置:socket

time-format %H:%M:%S
date-format %d/%b/%Y
log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"

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

%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 命令參數,以下:工具

$ 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 -a -d -f /data/logs/fanhaobai.com.access.log -p /etc/goaccess.conf

控制檯下的操做方法:

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

HTML模式

$ goaccess -a -d -f /data/logs/fanhaobai.com.access.log -p /etc/goaccess.conf -o /data/html/hexo/public/go-access.html

本站分析出的報表效果,見這裏。這個分析報表是經過手動執行命令生成,因此須要實現 GoAccess 自動地建立報表。

daemonize

GoAccess 已經爲咱們考慮到這點了,它能夠以 daemonize 模式運行,並提供建立實時 HTML 的功能,只須要在啓動命令後追加--real-time-html --daemonize參數便可。

$ goaccess -a -d -f /data/logs/fanhaobai.com.access.log -p /etc/goaccess.conf -o /data/html/hexo/public/go-access.html --real-time-html --daemonize
# 監聽端口7890
$ netstat -tunpl | grep "goaccess"
tcp   0   0 0.0.0.0:7890      0.0.0.0:*     LISTEN      21136/goaccess

以守護進程啓動 GoAccess 後,使用 Websocket 創建長鏈接,它默認監聽 7890 端口,能夠經過--port參數指定端口號。

因爲個人站點啓用了 HTTPS,因此 GoAccess 也須要使用 openssl,在配置文件 goaccess.conf中配置 ssl-certssl-key項,並確保在安裝過程當中 configure 時已添加 --with-openssl項來支持 openssl 。當使用 HTTPS 後 Websocket 通訊時也應該使用 wss 協議,須要將 ws-url項配置爲 wss://www.domain.com

crontab

在某些場景下,沒有這樣的實時性要求,可採用 crontab 機制實現定時更新 HTML 報表。

# 天天執行
0 0 1 * * goaccess -a -d -f /data/logs/fanhaobai.com.access.log -p /etc/goaccess.conf -o /data/html/hexo/public/go-access.html 2> /data/logs/go-access.log

問題

到這裏,惟一讓我困惑且還未實踐的是,當 access 日誌被切割後,怎麼合理使用 GoAccess 分析日誌,--keep-db-files這個功能卻是能夠嘗試,這樣就能夠只分析新生產的日誌文件了。

官方文檔: https://goaccess.io/man

高階

儘管 GoAccess 很強大,可是它沒法制定自定義監控規則,沒法知足對站點更細粒度更全面的監控需求。到 2017 年末,本站已經使用 ELK 日誌平臺 來分析站點的訪問狀況和流量分析了,效果見 [ELK 集中式日誌平臺](https://www.fanhaobai.com/abo...
)。

相關文章 »

相關文章
相關標籤/搜索