#docker #access log #HTTP server #C

Goaccess - 访问日志

摘要

HTTP serveraccess log 记录着每个请求的基础信息,对这些数据进行分析汇总,可以得到网站请求时间分配、推荐网站、浏览器版本等数据图表。可实时分析每个请求也可在命令行中查看分析结果,为网站分析提供图表支持。

背景

前不久,写了一篇 《Caddy 简介 - 使用 caddy 实现短网址服务》 可以通过简单的配置对本站作了一些推广,于是想着分析一下访问的来路及其它指标,这样更利于下次的推广。

对于站点的分析可以加入第三方的统计代码,但是第三方的统计一般实时性并没有那么高,也不利于定制化,比如一些警告。

效果

效果预览

开始

goaccess 是用 C 语言编写的一个分析命令,现在已经可以实现实时分析,分析速度也是极快的。只依赖一个配置文件,也可以方便得在命令行中查看实时状态。

安装

一般可以使用 docker 的,我都会用 docker 来作讲解。下面是所有安装方式

源码安装:

$ 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

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

centos

$ yum install goaccess

OS X / Homebrew

$ brew install goaccess

Docker

$ docker pull allinurl/goaccess

配置

将所有 goaccess 的相关的文件统一放在 /data/goaccess

$ mkdir -p /data/goaccess/{data,html,logs}
  • data 放置配置文件
  • html 放置生成的 html 文件,即前面发的效果图
  • logs 放置 access log 文件

/data/goaccess/data/goaccess.conf 中写入如下配置:

可参照官方配置修改 goaccess.conf

log-format COMBINED
config-dialog false
hl-header true
json-pretty-print false
no-color false
no-column-names false
no-csv-summary false
no-progress false
no-tab-scroll false
with-mouse false
real-time-html true
agent-list false
with-output-resolver false
http-method yes
http-protocol yes
no-query-string false
no-term-resolver false
444-as-404 false
4xx-to-unique-count false
all-static-files false
double-decode false
ignore-crawlers false
crawlers-only false
ignore-panel REFERRERS
ignore-panel KEYPHRASES
real-os true
static-file .css
static-file .js
static-file .jpg
static-file .png
static-file .gif
static-file .ico
static-file .jpeg
static-file .pdf
static-file .csv
static-file .mpeg
static-file .mpg
static-file .swf
static-file .woff
static-file .woff2
static-file .xls
static-file .xlsx
static-file .doc
static-file .docx
static-file .ppt
static-file .pptx
static-file .txt
static-file .zip
static-file .ogg
static-file .mp3
static-file .mp4
static-file .exe
static-file .iso
static-file .gz
static-file .rar
static-file .svg
static-file .bmp
static-file .tar
static-file .tgz
static-file .tiff
static-file .tif
static-file .ttf
static-file .flv

要是你的 access log 日志格式不是默认的,那需要配置成相应的格式:

log-format COMBINED

这里使用的是 COMBINED 格式,可参考这里

其它一些配置可以写入配置文件,也可以在命令行中直接指定。

启动 goaccess

docker run --restart=always -d -p 8080:7890 \
  -v "/data/goaccess/data:/srv/data" \
  -v "/data/goaccess/html:/srv/report" \
  -v "/data/goaccess/logs:/srv/logs" \
  -e LANG=zh_CN.UTF-8 \
  --name=goaccess allinurl/goaccess \
  goaccess --no-global-config --config-file=/srv/data/goaccess.conf  \
           --ws-url=127.0.0.1:8080 --output=/srv/report/index.html \
           --log-file=/srv/logs/access.log

将本地目录挂到容器中:

  -v "/data/goaccess/data:/srv/data" \
  -v "/data/goaccess/html:/srv/report" \
  -v "/data/goaccess/logs:/srv/logs"

指定生成的为中文页面,不添加此参数则会生成英文页面:

  -e LANG=zh_CN.UTF-8

窗口名及镜像名:

  --name=goaccess allinurl/goaccess

执行 goaccess 命令,并指定参数:

  goaccess --no-global-config --config-file=/srv/data/goaccess.conf  \
           --ws-url=127.0.0.1:8080 --output=/srv/report/index.html \
           --log-file=/srv/logs/access.log
  • --no-global-config 不从 /usr/etc/, /etc/ 或 /usr/local/etc/ 目录加载配置文件
  • --config-file=/srv/data/goaccess.conf 指定 goaccess 配置文件,本地对应 /data/goaccess/data/goaccess.conf
  • --ws-url=127.0.0.1:8080 实时分析会启动 websocket 来推着实时更新的数据。注意这里的端口需要与服务暴露的端口一致,使用 docker 启动的需要使用对宿主机暴露的端口,如:-p 8080:7890 则需要使用 8080
  • --output=/srv/report/index.html 生成分析文本的静态页面,会使用 websocket 来更新数据。对应本地地址为 /data/goaccess/html/index.html
  • --log-file=/srv/logs/access.log 需要分析的日志文件,对应本地目录 /data/goaccess/logs/access.log

以上执行完成后,数据量少的情况下,很快可以生成 index.html 文件,直接在浏览器中打开就可以看到 效果 小结的类似图表。

数据落地

网站运行时间长了,会产生很大的日志量。分开来处理这些是不错的方式,当然能够批量处理 access.log 又不会重复计算相同的记录将更加友好。

只需添加 --keep-db-files 参数,就能把分析过的数据写到 --db-path <dir> 指定的目录,未指定默认放在 /tmp 目录下。

比如:

$ goaccess access.log.1 --keep-db-files

向这个落地的数据追加数据:

$ goaccess access.log --load-from-disk --keep-db-files

注意 :当使用 --load-from-disk 时未指定 --keep-db-files,则会在程序退出时删除落地的数据库。

还可以查看数据库中存储的内容:

$ goaccess --load-from-disk --keep-db-files

小结

这是一种无侵入的方式来分析自己的站点,可以离线或者放在其它机器上定时分析发送邮件报告,对于原站的性能不会造成任何影响。

这个工具的实时离线功能都很好用,不过有一点不能在一个服务中很好得区别每个 host。就是可以在展示页的头部选择需要查看的站点,统计的数据仅只对这个站点。数据更新时也只更新单个 host,这对于一台服务器部署多个服务的使用都会方便很多。

如果你不关注单 host 的请求状态,而是关心整个服务器中的请求,仅要简单区分是哪个站点的流量,可以将你的主机名直接添加到 access log 中的请求路径之前,和路径连成一个数据进行分析。

这样在查看图表时展示的就是 host + 路径,依然可以分析到每个 host 的请求情况。

Author Mo 最后更新: 2018-12-28 23:12:02