1. 程式人生 > 其它 >使用 goaccess 分析nginx 日誌

使用 goaccess 分析nginx 日誌

分析nginx日誌

GoAccess的多種展示方式
goaccess有多種資料視覺化的方式,分別為:

命令列輸出格式化資料
利用access.log生成靜態的視覺化資料
生成實時視覺化資料
注意,如果是編譯安裝且選擇了 –enable-geoip=mmdb的話需要編輯配置檔案,並在使用命令的時候帶上引數 –config-file=/usr/local/etc/goaccess/goaccess.conf,如果是用包管理器安裝的話則不需要

命令列輸出GoAccess
goaccess /var/log/nginx/access.log -c,會先詢問你資料的格式,我這裡的日誌使用的是第一種。

解析accesslog生成靜態html
GoAccess還可以解析access.log生成靜態html,以更加直觀的方式來展示資料。

goaccess /var/log/nginx/access.log -o report.html --log-format=COMBINED,之後再使用瀏覽器訪問report.html即可檢視報告,各種資料一應俱全。

實時解析訪問日誌
GoAccess除了可以生成靜態的html檔案,還可以生成實時網站訪問資料!

goaccess /var/log/nginx/access.log -o /var/www/html/report.html --log-format=COMBINED --real-time-html --config-file=/usr/local/etc/goaccess/goaccess.conf


新增中文支援
Goaccess 1.3之後的版本提供了多語言支援,先在命令列中執行 apt install language-pack-zh-hans 安裝中文包,再使用export LANG=zh_CN.UTF-8修改環境變數,再次使用 goaccess /var/log/nginx/access.log -o /var/www/html/report.html --log-format=COMBINED --real-time-html --config-file=/usr/local/etc/goaccess/goaccess.conf啟動GoAccess可以發現已經是中文介面了。

關於實時模式,可以檢視官網的demo https://rt.goaccess.io/?20200209201008

異常退出
如果實時模式沒有正常退出,可能無法再次正常啟動,GoAccess預設使用7890 websocket埠,所以使用lsof -i:7890檢視佔用該埠的程序號並kill即可。

ssl支援
如果需要在加密連線上輸出實時資料,則需要使用 --ssl-cert= 和 --ssl-key=,我在設定之後訪問report.html發現數據依舊是靜態的,突然想起我用了cloudflare cdn,而7890埠並不在cloudflare的支援埠列表裡面,所以我使用引數 --ws-url=wss://伺服器域名(我們的瀏覽器會嘗試與該域名的8443埠見了ws連線):8443 --port=8443 把埠改成了8443。令人沒想到的是,此時的report.html使用代理連結的時候是可以連線的,並可以檢視實時資訊,而直接連線的時候依舊是靜態資料,tcping一看。

去cloudflare的官網可以發現如下內容

只有埠 80 和 443 可相容以下服務:

對於啟用了中國網路的域名的中國境內資料中心 HTTP/HTTPS 流量,
也就是說,國內是沒辦法通過cloudflare連線非80/443埠的…

反向代理
但是也不是沒有辦法連線,最後我想到了反向代理的方案。

將啟動引數改為--ws-url=wss://你的域名.com/goaccess --port=7890

修改nginx站點配置檔案 /etc/nginx/site-available/default,新增下面內容

location /goaccess {
    proxy_redirect off;
    proxy_pass https://127.0.0.1:7890;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
}

注意,如果你的站點配置檔案裡面開啟了url重寫,為了避免 /goaccess 受到影響,我們需要把該路徑排除重寫。

把重寫規則都放到location / 裡面去

location / { 
    if (-f $request_filename/index.html){
    rewrite (.*) $1/index.html break;
    }
    if (-f $request_filename/index.php){
    rewrite (.*) $1/index.php;
    }
    if (!-f $request_filename){
    rewrite (.*) /index.php;
    }
} 

下面什麼都不需要做

location /goaccess/ {
}

之後重啟nginx,再訪問report.html,發現左邊齒輪處終於顯示connect了。

如果你只是自己看或者不在意ip暴露,其實直接使用ip直接連線不走cdn就沒那麼麻煩了。

夢裡不知身是客,一晌貪歡。