在开始分析浏览流量之前,我们需要准备一台安装了 Nginx 的 Linux 服务器。本文以 CentOS 7 和 Ubuntu 20.04 为例,演示如何安装 GoAccess。GoAccess 是一款开源的实时 Web 日志分析工具,运行速度快,资源占用低。
确保系统已安装 EPEL 源,然后直接使用 yum 安装。如果默认源版本过低,建议编译安装,但此处为了快速落地,使用包管理器安装:
yum install epel-release -y
yum install goaccess -y
Ubuntu 的默认源通常包含较新版本的 GoAccess,直接执行 apt 命令即可:
apt-get update
apt-get install goaccess -y
安装完成后,使用 goaccess -V 命令检查版本,确保版本大于 1.2,以便支持 HTML 实时输出功能。
GoAccess 需要特定的日志格式才能正确解析数据。默认的 Nginx combined 格式可以解析,但为了获得更详细的浏览流量信息(如请求耗时、主机名),我们需要自定义日志格式。
编辑 Nginx 配置文件(通常位于 /etc/nginx/nginx.conf),在 http 块中添加或修改以下 log_format 配置:
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'$request_time $upstream_response_time';
access_log /var/log/nginx/access.log main;
...
}
注意:配置完成后,必须执行 nginx -s reload 重载配置使日志格式生效。这里的 access.log 路径请根据你服务器实际情况调整,这是后续分析的数据源。
GoAccess 默认尝试自动识别 Nginx 日志,但为了确保万无一失,特别是我们添加了请求时间字段,建议手动指定解析格式。GoAccess 使用 C 语言风格的格式字符串,这与 Nginx 的 log_format 略有不同。
我们可以创建一个配置文件 /etc/goaccess.conf,或者直接在命令行中指定。为了方便后续复用,这里采用配置文件的方式。新建或编辑该文件:
time-format %T
date-format %d/%b/%Y
log_format %h - %^ [%d:%t %^] "%r" %s %b "%R" "%u" "%^" %L %^
参数详解:
配置好解析规则后,我们可以生成一个可视化的 HTML 报告。GoAccess 支持生成静态 HTML,也支持通过 WebSocket 实时刷新数据。这里我们采用实时模式。
执行以下命令启动 GoAccess:
goaccess /var/log/nginx/access.log \
-c /etc/goaccess.conf \
-o /var/www/html/report.html \
--real-time-html \
--daemonize
命令参数说明:

执行成功后,GoAccess 会在后台运行,并监听默认的 7890 端口用于 WebSocket 推送数据。
为了让你在浏览器中访问 report.html 时能看到实时更新的数据,需要配置 Nginx 将 GoAccess 的 WebSocket 请求转发到后端。
编辑你的 Nginx 站点配置文件(例如 /etc/nginx/conf.d/default.conf),添加以下 location 块:
server {
listen 80;
server_name your_domain.com;
location /report.html {
alias /var/www/html/report.html;
}
location /ws {
proxy_pass http://127.0.0.1:7890;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
配置关键点:
修改配置后,再次执行 nginx -s reload。此时,在浏览器中访问 http://your_domain.com/report.html,你将看到一个包含访问量、独立访客、请求时间、热门 URL 等详细信息的仪表盘,且数据每秒自动刷新。
在分析浏览流量时,静态资源(如图片、CSS、JS)和健康检查请求通常会干扰数据准确性。我们需要在分析时排除这些流量。
在启动 GoAccess 时,可以使用 --exclude 参数忽略特定的 IP 或请求。例如,忽略本机健康检查:
goaccess /var/log/nginx/access.log \
--exclude=127.0.0.1 \
-c /etc/goaccess.conf \
-o /var/www/html/report.html \
--real-time-html \
--daemonize
要忽略所有以 .css, .js, .png, .jpg 结尾的请求,可以使用 --ignore-panel 或者直接在日志解析层面处理。更简单的方法是修改 Nginx 配置,将静态资源日志写入另一个文件,或者使用 GoAccess 的 --anonymize-ip 等功能。
但最直接的过滤方式是利用管道符结合 grep。如果你只是想临时生成一份不含静态资源的报告,可以这样做:
grep -v -E "\.(css|js|png|jpg|jpeg|gif|ico|woff|svg)$" /var/log/nginx/access.log | goaccess -c /etc/goaccess.conf -o /var/www/html/report_static.html
注意:使用管道符后,--real-time-html 模式可能无法正常工作,因为 tail -f 的机制被破坏了。对于实时监控,建议在 Nginx 配置层面通过 access_log off; 关闭静态资源的日志记录,这样日志文件本身就只包含有效浏览流量。
如果打开页面全是空数据,或者终端报错 No valid date/time format was found,说明 goaccess.conf 中的格式与 Nginx 实际日志格式不一致。请使用 tail -n 1 /var/log/nginx/access.log 查看最后一行日志,对比格式字符串进行微调。
如果页面能打开但数据不刷新,按 F12 打开浏览器控制台,查看是否有 WebSocket 连接错误。通常是因为 Nginx 没有正确配置 Upgrade 头部,或者防火墙拦截了 7890 端口。检查防火墙状态:
firewall-cmd --list-all
如果需要开放端口(仅用于调试,生产环境建议走本地回环)
firewall-cmd --add-port=7890/tcp --permanent
firewall-cmd --reload
如果 GoAccess 无法写入 HTML 文件或读取日志文件,请检查文件权限。通常需要将 GoAccess 以 root 用户运行,或者将日志文件的读权限赋予运行 GoAccess 的用户:
chown -R www-data:www-data /var/www/html/report.html
chmod 644 /var/log/nginx/access.log易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图