Skip to content

使用 GoAccess 分析 Nginx 访问日志

工具安装 (不推荐, 下载的版本太低)

对于基于 Debian 的系统「如 Ubuntu」,可以使用以下命令安装:

sh
sudo apt-get update
sudo apt-get install goaccess

对于基于 Red Hat 的系统「如 CentOS」,可以使用以下命令安装:

sh
sudo yum -y install goaccess

源码安装 (推荐使用1.4以上版本, 支持json日志)

如果想要从源码安装 GoAccess,可以按照以下步骤操作。先下载 GoAccess 的源码包:

sh
wget https://tar.goaccess.io/goaccess-1.9.3.tar.gz

再解压并编译安装:

sh
tar -xzvf goaccess-1.9.3.tar.gz
cd goaccess-1.9.3/
./configure --enable-utf8 --enable-geoip=mmdb
make && make install

需要确保安装了必要的开发工具和库

sh
yum install gcc make automake autoconf libtool pkgconfig ncurses-devel geoip-devel libmaxminddb-devel

配置工具

我们需要对 GoAccess 进行配置,确保它能够正确地解析 Nginx 的访问日志。GoAccess 配置文件通常位于 /etc/goaccess/goaccess.conf。对于 Nginx 的默认日志格式,可直接使用--log-format=COMBINED 参数。如果 Nginx 配置了自定义的日志格式,需在 GoAccess 的配置文件中指定相应的日志格式。例如:

log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"

还需指定日期和时间的格式,以确保 GoAccess 能够正确地解析日志文件中的日期和时间信息。例如:

date-format %d/%b/%Y
time-format %H:%M:%S

分析日志

在终端直接运行 GoAccess,它会进入一个交互式的界面,显示日志分析结果。在交互式界面中可使用键盘方向键和数字键来浏览和查看不同的统计信息。例如:

sh
goaccess /var/log/nginx/access.log --log-format=COMBINED

GoAccess 可将分析结果输出为 HTML 格式的报告,方便在 Web 浏览器中查看。下面的命令将生成一个名为 report.html 的文件,包含丰富的统计信息和图表:

sh
goaccess /var/log/nginx/access.log -o report.html --log-format=COMBINED

GoAccess 支持实时监控 Nginx 访问日志,可动态地更新统计信息。如要启用实时监控,可以使用以下命令:

sh
--real-time-html --daemonize

启动一个后台进程,实时分析日志文件,并将结果输出到指定的 HTML 文件中,完整参考命令如下:

sh
goaccess /var/log/nginx/access.log -o /var/www/html/report.html --log-format=COMBINED --real-time-html --daemonize

最佳实践

例如: 在nginx.conf自定义了日志格式

nginx
log_format main escape=json '{'
    '"time_local":"$time_iso8601",'
    '"ip":"$remote_addr",'
    '"request":"$request",'
    '"status":$status,'
    '"request_time":$request_time,'
    '"params":"$args",'
    '"bytes":$body_bytes_sent,'
    '"body":"$request_body"'
'}'

打印的日志格式为

log
{"time_local":"2025-03-04T23:41:02+08:00","ip":"51.222.253.18","request":"GET /vite/java/skeleton/docker/sync.html HTTP/1.1","status":200,"request_time":0.000,"params":"","bytes":19904,"body":""}

Nginx 的 $time_iso8601 生成的时区格式为 +08:00,但 GoAccess 对时区的识别和我们常用的逻辑不一致。这里使用%dT%t+%^去匹配2025-03-04T23:41:02+08:00, %d对应--date-format=%Y-%m-%d, %t对应--time-format=%T, %^来跳过不需要的字符, 保留固定文本T+

sh
goaccess /var/log/nginx/access.log -o report.html --log-format='{ "time_local": "%dT%t+%^", "ip": "%h", "request": "%r", "status": "%s", "request_time": "%T", "params": "%q", "bytes": "%b", "body": "%%" }' --date-format=%Y-%m-%d --time-format=%T

分析结果解读

GoAccess 提供了丰富的统计信息和图表,帮助我们全面了解网站访问情况,包括访问概览:

维度描述
网站的总访问次数显示网站总访问量。
网站的独立访客数统计访问网站的不同 IP 地址数量。
总数据传输量表示网站传输数据总量,单位通常为 MB 或 GB。

网站的访问者信息:

维度描述
IP 地址的排名列出访问网站的 IP 地址及其访问次数,可以了解访问者的地理位置分布。
访问者的浏览器和操作系统统计访问者使用的浏览器和操作系统类型,有助于优化网站兼容性。

请求信息:

维度描述
请求方法显示不同 HTTP 请求方法的请求次数。
请求的状态码统计不同 HTTP 状态码请求次数,如 200 表示成功,404 表示未找到。
请求 URL 的排名列出被访问最多 URL 地址,可发现网站的热门内容。

性能分析:

维度描述
请求时间分布显示不同时间段请求量,可发现访问高峰期。
最耗时的请求列出响应时间最长请求,有助于发现性能的瓶颈。

高级用法

除了基本分析功能,GoAccess 还支持一些高级用法。例如可使用管道和过滤器来处理日志数据,下面命令将实时地分析 Nginx 的访问日志,并显示最新的统计信息:

sh
tail -f /var/log/nginx/access.log | goaccess -p /etc/goaccess/goaccess.conf

GoAccess 可支持同时分析多个日志文件,下面命令将合并多个日志文件的分析结果:

sh
goaccess -p /etc/goaccess/goaccess.conf access.log.1 access.log.2

粤ICP备20009776号