官网地址:https://goaccess.io/
官方 github 地址:https://github.com/allinurl/goaccess
官方 demo 地址:https://rt.goaccess.io/?20190828082924
一、前言
GoAccess 在 GitHub 的源码库上已经给出了多种安装方式,源码编译,apt-get,docker 等,挑一种自己喜欢的就可以了。这里需要说明的是,如果想要使用某些特性如地理位置,ssl 连接等的话,则需要编译安装,可以先将依赖装好,再编译安装即可。
二、安装
1.centos 编译安装
#安装依赖 yum -y install gcc make GeoIP-devel ncurses-devel 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
执行 configure 配置,根据需要选用配置项,可以通过
./configure --help
查看可选参数。
配置选项
可以使用多个选项配置 GoAccess。有关配置选项的完整最新列表,请运行
./configure --help
-
--enable-debug
:使用调试符号进行编译并关闭编译器优化。 -
--enable-utf8
:编译具有广泛的字符支持。 -
--enable-geoip=<legacy|mmdb>
:使用 GeoLocation 支持进行编译。MaxMind 的 GeoIP 是必需的。legacy
将使用原始的 GeoIP 数据库。mmdb
将使用增强的 GeoIP2 数据库。 -
--enable-tcb=<memhash|btree>
:与 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
:使用 OpenSSL 编译 GoAccess,支持其 WebSocket 服务器。
不需要走 https 的话可以去掉 --with-openssl 选项
2.centos 包管理器安装
如果使用 yum install goaccess
直接安装,需要先安装 epel 源。
sudo yum install -y epel-release
安装排错
由于官网并未提供安装之前的依赖包,故安装之后会出现如下错误
FAQ:
根据错误提示解决依赖关系:
configure: error:
Missing development files for the GeoIP library
安装需要的软件包
yum install -y GeoIP-devel
再次运行预编译命令并根据错误提示解决依赖关系:
configure: error:
Missing development libraries for ncursesw
安装需要的软件包:
yum install -y ncurses-devel
附上各个平台依赖包列表
3.ubuntu 包管理器安装
apt-get install goaccess
上述方法安装的 goaccess 只是 1.2 版本的,故需要升级,方法见下
echo "deb https://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
4.ubuntu 编译安装
#安装依赖库 apt-get install libncursesw5-dev libssl-dev libgeoip-dev #安装编译依赖的包 apt-get install gcc make 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
三、检测 goaccess 版本
root@ubuntu:~# goaccess --version GoAccess - 1.3. For more details visit: http://goaccess.io Copyright (C) 2009-2016 by Gerardo Orellana Build configure arguments: --enable-utf8 --enable-geoip=legacy
若添加了 openssl 编译参数的话,效果如下:
[root@ubuntu]~# goaccess --version GoAccess - 1.3. For more details visit: http://goaccess.io Copyright (C) 2009-2016 by Gerardo Orellana Build configure arguments: --enable-utf8 --enable-geoip=legacy --with-openssl
四、配置
1.首先机器上得有 nginx 环境
2.goaccess 配置
选择一个路径存放 goaccess 的配置文件,这里我选择 /usr/local/src/goaccess
目录
新建 goaccess.conf,内容如下:
time-format %H:%M:%S date-format %d/%b/%Y log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u" real-time-html true port <port> ssl-cert <cert.crt> ssl-key <priv.key> ws-url wss://<your-domain>:<port> output /usr/local/src/goaccess/index.html log-file /usr/local/src/goaccess/goaccess.log
参数解释
- real-time-html 用来使用实时刷新特性;
- port 是用来和浏览器通信的,选一个没被占用的就行(别忘了在防火墙里开启端口);
- 如果你不走 https 的话,ssl-cert,ssl-key,ws-url 都不是必需的;
- output:存放 goaccess 的站点目录;
- log-file:goaccess 的日志文件,后来发现运行后里面都是空的,暂时不知道为啥 ;
需要注意的几点
三个 format 的设置要与 nginx 的设置一致,当然如果你像我这样根本没改过 nginx 的日志格式的话就用这个就行了;
nginx 中的日志格式如下:
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
3.nginx 配置
这里我是用的 80 映射的 7890 端口,你可以根据实际情况选择端口号
http 方式
user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; include /etc/nginx/conf.d/*.conf; upstream goaccess { server 127.0.0.1:7890; } server { listen 80 default_server; listen [::]:80 default_server; server_name goaccess; #root /usr/share/nginx/html; root /usr/local/src/goaccess; # Load configuration files for the default server block. # include /etc/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } }
更新 nginx 配置:
nginx -s reload
注意:若网页打开
403
报错的话,请查看站点目录是否有足够的权限访问,或者将上面的nginx.conf
文件中user
从nginx
改为root
https 方式
在 443 配置下添加如下内容:
location /goaccess { root /usr/local/src; }
别忘了在防火墙中添加 7890
端口,若是云服务器得在安全策略中开通 tcp:7890
4.运行
goaccess --config-file /usr/local/src/goaccess/goaccess.conf /var/log/nginx/access.log
说明
- --config-file : 指定配置文件,不写默认使用/etc/goaccess.conf
- /var/log/nginx/access.log : 指定 nginx 的日志
效果
可以访问本站监控地址:https://leif.fun/goaccess
五、设置开机自启
设置 goaccess
开机自启
一般来讲,设置开机自启可以使用 systemctl
或者 Supervisor
,自启文件如下。
supervisor
[program:goaccess] command=/usr/local/bin/goaccess --config-file=/usr/local/src/goaccess/goaccess.conf /var/log/nginx/access.log directory=/usr/local/src/goaccess/ user=root stdout_logfile=/var/log/goaccess.log autostart=true autorestart=true redirect_stderr=true stopsignal=QUIT
systemctl
[Unit] Description=GoAccess After=network.target [Service] ExecStart=/usr/local/bin/goaccess --config-file=/usr/local/src/goaccess/goaccess.conf /var/log/nginx/access.log Restart=on-failure [Install] WantedBy=multi-user.target
六、扩展功能
细心的同学会发现,官网提供的示例上包含了平均响应时,总共响应时和最高响应时,但是依据上述教程操作下来看并没有出现以下内容
那是因为 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" ' '$connection $upstream_addr ' '$upstream_response_time $request_time';
格式新增过后,goaccess 配置文件中有关日志格式的部分也需要更改,但是有的同学并不知道配置中的每个参数代表什么意义,这里我具体贴出来
log-format 与 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 请求所花费的时间,单位秒 %^ 忽略这一字段
但是,这样的方法太过复杂了,我们可以使用 nginx2goaccess.sh 脚本将 nginx 日志格式格式化为 goaccess 能识别的日志格式,nginx2goaccess.sh 脚本内容在 https://github.com/stockrt/nginx2goaccess/blob/master/nginx2goaccess.sh
nginx2goaccess.sh
log_format="$1" # Usage if [[ -z "$log_format" ]]; then echo "Usage: $0 '<log_format>'" exit 1 fi # Variables map conversion_table="time_local,%d:%t_%^ host,%v http_host,%v remote_addr,%h request_time,%T request_method,%m request_uri,%U server_protocol,%H request,%r status,%s body_bytes_sent,%b bytes_sent,%b http_referer,%R http_user_agent,%u" # Conversion for item in $conversion_table; do nginx_var=${item%%,*} goaccess_var=${item##*,} goaccess_var=${goaccess_var//_/ } log_format=${log_format//\$\{$nginx_var\}/$goaccess_var} log_format=${log_format//\$$nginx_var/$goaccess_var} done log_format=$(echo "$log_format" | sed 's/${[a-z_]*}/%^/g') log_format=$(echo "$log_format" | sed 's/$[a-z_]*/%^/g') # Config output echo " - Generated goaccess config: time-format %T date-format %d/%b/%Y log_format $log_format "
使用如下方法获取日志格式:
sh nginx2goaccess.sh '<log_format>' #log_format为你nginx.conf中配置的日志格式
如:
bash nginx2goaccess.sh '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for" $connection $upstream_addr $upstream_response_time $request_time'
会得到三个格式
time-format %T date-format %d/%b/%Y log_format %h - %^ [%d:%t %^] "%r" %s %b "%R" "%u" "%^" %^ %^ %^ %T
将上述格式填写到 goaccess 配置文件中即可
先重启 nginx
之后再重启 goaccess
即可
七、参考
https://www.jianshu.com/p/3b147fdbac86
https://www.jianshu.com/p/b134995ae16c
https://blog.51cto.com/13594742/2406665
https://www.cnblogs.com/erbiao/p/9221671.html
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于