GoAccess 日志分析完全指南 / 05 - 实时监控
05 - 实时监控
5.1 概述
GoAccess 的核心竞争力之一是实时监控能力。与传统的日志分析工具(分析完成后才能查看结果)不同,GoAccess 可以在日志持续写入的同时,实时更新分析数据并展示给用户。
GoAccess 提供两种实时监控模式:
| 模式 | 说明 | 适用场景 |
|---|---|---|
| 终端实时面板 | 基于 ncurses 的交互式界面 | SSH 运维、本地调试 |
| HTML 实时面板 | 通过 WebSocket 推送至浏览器 | 团队共享、远程监控、展示 |
实时监控架构:
┌──────────────┐
│ Nginx 日志 │──→ tail -f ──→ GoAccess 解析引擎
└──────────────┘ │
┌───────┴────────┐
▼ ▼
终端面板(ncurses) WebSocket 服务器
实时刷新显示 ↓
HTML 实时面板
(浏览器自动刷新)
5.2 终端实时面板
5.2.1 基本用法
终端实时面板是 GoAccess 最基础的实时监控方式,通过 tail -f 管道持续读取日志:
# 实时监控 Nginx 日志
tail -f /var/log/nginx/access.log | goaccess --log-format=COMBINED -
# 实时监控多个日志文件
tail -f /var/log/nginx/access.log /var/log/nginx/app.log | goaccess --log-format=COMBINED -
注意:必须使用
-参数,告诉 GoAccess 从标准输入读取数据。
5.2.2 终端面板操作
实时模式下,终端面板的交互操作与静态模式一致:
| 快捷键 | 功能 |
|---|---|
F5 | 手动刷新 |
Tab | 切换到下一个面板 |
1-9, 0 | 直接跳转到对应面板 |
j / k | 向下/向上滚动 |
s | 排序选择 |
q | 退出 |
5.2.3 面板排序
在实时模式下,可以动态改变面板排序方式:
面板内按 s → 选择排序字段:
- By Hits: 按请求数排序
- By Visitors: 按访客数排序
- By Bandwidth: 按带宽排序
- By Cum. Bandwidth: 按累计带宽排序
- By Avg. T.S. (Bw): 按平均请求大小排序
5.2.4 启动时预设排序
# 按访客数排序
tail -f /var/log/nginx/access.log | \
goaccess --log-format=COMBINED \
--sort-panel=VISITORS,BY_VISITORS \
-
# 面板请求按带宽排序
tail -f /var/log/nginx/access.log | \
goaccess --log-format=COMBINED \
--sort-panel=REQUESTS,BY_BANDWIDTH \
-
5.2.5 终端配色方案
实时监控时,合适的配色方案能减少视觉疲劳:
# 方案 1: 默认配色(经典)
tail -f access.log | goaccess --log-format=COMBINED -
# 方案 2: 绿色终端风格
# 在配置文件中添加:
# color-scheme 1
GoAccess 提供以下内置配色方案:
| 方案 | 名称 | 适用场景 |
|---|---|---|
| 0 | 标准 | 默认方案 |
| 1 | Monokai | 暗色终端 |
| 2 | 绿色风格 | 传统终端风格 |
5.2.6 生产环境推荐用法
# 使用 screen/tmux 保持会话不中断
tmux new-session -d -s goaccess \
'tail -f /var/log/nginx/access.log | goaccess --log-format=COMBINED -'
# 附加到会话
tmux attach -t goaccess
# 分离会话: Ctrl+B, D
# 或使用 screen
screen -dmS goaccess bash -c \
'tail -f /var/log/nginx/access.log | goaccess --log-format=COMBINED -'
# 附加到 screen
screen -r goaccess
5.3 HTML 实时面板
HTML 实时面板通过 WebSocket 将分析数据实时推送到浏览器,是团队共享和远程监控的理想方案。
5.3.1 基本用法
# 生成实时 HTML 面板
tail -f /var/log/nginx/access.log | \
goaccess --log-format=COMBINED \
-o /var/www/html/report.html \
--real-time-html
运行后,GoAccess 会:
- 生成
report.html文件 - 启动一个 WebSocket 服务器(默认端口 7890)
- 在终端中保持运行,等待日志输入
- 浏览器打开 HTML 文件后通过 WebSocket 接收实时数据
5.3.2 WebSocket 通信原理
┌────────────┐ WebSocket ┌─────────────────┐
│ 浏览器 │◄─────────────────►│ GoAccess │
│ (HTML页面) │ ws://host:7890 │ (WS 服务端) │
└────────────┘ └─────────────────┘
↑
│ 解析数据
│
┌───────────────┐
│ tail -f log │
│ (日志输入) │
└───────────────┘
数据流:
- 日志文件持续写入新记录
tail -f捕获新记录并通过管道传给 GoAccess- GoAccess 解析新记录,更新内部统计
- 通过 WebSocket 将更新后的数据推送到所有连接的浏览器
- 浏览器 HTML 面板自动更新显示
5.3.3 自定义 WebSocket 端口
# 使用自定义端口
tail -f /var/log/nginx/access.log | \
goaccess --log-format=COMBINED \
-o report.html \
--real-time-html \
--ws-url=ws://your-server:9090
5.3.4 使用 WSS(WebSocket Secure)
在生产环境中,建议使用 WSS 加密连接:
# 生成自签名证书(仅用于测试)
openssl req -x509 -newkey rsa:2048 -keyout /etc/goaccess/key.pem \
-out /etc/goaccess/cert.pem -days 365 -nodes
# 使用 WSS 连接
tail -f /var/log/nginx/access.log | \
goaccess --log-format=COMBINED \
-o report.html \
--real-time-html \
--ssl-cert=/etc/goaccess/cert.pem \
--ssl-key=/etc/goaccess/key.pem \
--ws-url=wss://your-domain.com:7890
5.3.5 反向代理 WebSocket
在生产环境中,通常通过 Nginx 反向代理 WebSocket 连接:
Nginx 配置:
server {
listen 443 ssl;
server_name stats.example.com;
ssl_certificate /etc/ssl/certs/your-cert.pem;
ssl_certificate_key /etc/ssl/private/your-key.pem;
# 静态 HTML 文件
location / {
root /var/www/html;
index report.html;
}
# WebSocket 代理
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";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 86400;
}
}
GoAccess 配置:
tail -f /var/log/nginx/access.log | \
goaccess --log-format=COMBINED \
-o /var/www/html/report.html \
--real-time-html \
--ws-url=wss://stats.example.com/ws
5.3.6 HTML 面板配置选项
| 参数 | 说明 | 默认值 |
|---|---|---|
--real-time-html | 启用实时 HTML 模式 | 关闭 |
--ws-url=URL | WebSocket 连接地址 | ws://localhost:7890 |
--ssl-cert=FILE | SSL 证书文件 | 无 |
--ssl-key=FILE | SSL 私钥文件 | 无 |
--origin=URL | 允许的 CORS 来源 | 不限制 |
--fifo-in=PATH | FIFO 管道输入 | 无 |
--fifo-out=PATH | FIFO 管道输出 | 无 |
5.3.7 配置文件中的实时面板设置
# ~/.goaccessrc
# 实时 HTML 设置
real-time-html true
ws-url wss://stats.example.com/ws
ssl-cert /etc/goaccess/cert.pem
ssl-key /etc/goaccess/key.pem
5.4 刷新频率与性能
5.4.1 刷新间隔
GoAccess 的 HTML 实时面板默认每 1 秒 推送一次更新数据。这基于以下机制:
- GoAccess 每收到一条新日志记录就更新内部统计
- WebSocket 推送的频率取决于新日志的产生频率
- 浏览器面板的 UI 刷新频率由 JavaScript 控制
5.4.2 性能考虑
| 场景 | 每秒日志量 | CPU 占用 | 内存占用 |
|---|---|---|---|
| 小型网站 | < 10 条/s | < 1% | ~ 20 MB |
| 中型网站 | 10-100 条/s | 1-3% | ~ 50 MB |
| 大型网站 | 100-1000 条/s | 3-8% | ~ 100 MB |
| 超大流量 | > 1000 条/s | 8-15% | > 200 MB |
注意:以上数据为近似值,实际取决于日志格式复杂度和机器性能。
5.4.3 高流量场景优化
# 1. 使用 --no-color 减少终端渲染开销
tail -f access.log | goaccess --log-format=COMBINED --no-color -
# 2. 仅启用需要的面板
tail -f access.log | goaccess --log-format=COMBINED \
--ignore-panel=REFERRING_SITES \
--ignore-panel=REFERRING_URLS \
--ignore-panel=GEO_LOCATION \
--ignore-panel=KEYPHRASES \
-
# 3. 使用 --process-and-exit 配合 cron 定时生成报告
goaccess access.log --log-format=COMBINED \
-o report.html --process-and-exit
# 4. 对于超大日志使用持久化模式
goaccess access.log --log-format=COMBINED \
-o /tmp/db.db --persist
5.5 FIFO 管道模式
除了标准输入管道,GoAccess 还支持命名管道(FIFO)进行实时数据传输:
5.5.1 创建 FIFO 管道
# 创建 FIFO 管道
mkfifo /tmp/goaccess.fifo
# 方法一:通过 FIFO 输入日志
tail -f /var/log/nginx/access.log > /tmp/goaccess.fifo &
goaccess /tmp/goaccess.fifo --log-format=COMBINED
# 方法二:同时输入和输出通过 FIFO
mkfifo /tmp/goaccess_input.fifo /tmp/goaccess_output.fifo
# 启动 GoAccess
goaccess /tmp/goaccess_input.fifo \
--log-format=COMBINED \
-o /tmp/goaccess_output.fifo \
--real-time-html &
# 发送日志数据
tail -f /var/log/nginx/access.log > /tmp/goaccess_input.fifo &
# 读取输出
cat /tmp/goaccess_output.fifo > report.html
5.5.2 FIFO 与普通管道的区别
| 特性 | 普通管道 | | FIFO 管道 |
|---|---|---|
| 命名 | 无名 | 有文件路径 |
| 生命周期 | 命令结束即销毁 | 持久存在 |
| 多写入者 | 不支持 | 支持 |
| 多读取者 | 不支持 | 支持 |
| 适用场景 | 命令行一次性分析 | 持续运行的服务 |
5.6 多实例监控
5.6.1 同时监控多个网站
# 方案一:使用 tmux 多窗口
tmux new-session -d -s goaccess-main \
'tail -f /var/log/nginx/site1/access.log | goaccess --log-format=COMBINED -'
tmux new-window -t goaccess-main \
'tail -f /var/log/nginx/site2/access.log | goaccess --log-format=COMBINED -'
# 方案二:使用不同的 WebSocket 端口
# 终端 1
tail -f /var/log/nginx/site1/access.log | \
goaccess --log-format=COMBINED -o site1.html --real-time-html \
--ws-url=ws://localhost:7891
# 终端 2
tail -f /var/log/nginx/site2/access.log | \
goaccess --log-format=COMBINED -o site2.html --real-time-html \
--ws-url=ws://localhost:7892
5.6.2 使用 systemd 管理实时监控服务
创建 systemd 服务文件 /etc/systemd/system/goaccess-monitor.service:
[Unit]
Description=GoAccess Real-time Nginx Log Monitor
After=network.target nginx.service
[Service]
Type=simple
ExecStart=/bin/bash -c '/usr/bin/tail -f /var/log/nginx/access.log | /usr/local/bin/goaccess --log-format=COMBINED -o /var/www/html/report.html --real-time-html --ws-url=wss://stats.example.com/ws'
Restart=always
RestartSec=5
User=www-data
Group=www-data
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
# 启动服务
sudo systemctl daemon-reload
sudo systemctl enable --now goaccess-monitor
# 查看状态
sudo systemctl status goaccess-monitor
# 查看日志
sudo journalctl -u goaccess-monitor -f
5.7 通过 API 获取实时数据
GoAccess 的 WebSocket 通信采用 JSON 格式,可以通过编程方式接收和处理实时数据:
5.7.1 WebSocket 消息格式
{
"general": {
"total_requests": 12547,
"valid_requests": 12500,
"generation_time": 0,
"unique_visitors": 1234,
"unique_files": 567,
"bandwidth": 2684354560
},
"visitors": [...],
"requests": [...],
"static_requests": [...],
"not_found": [...],
"hosts": [...],
"os": [...],
"browsers": [...],
"referring_sites": [...],
"status_codes": [...]
}
5.7.2 用 Python 接收实时数据
#!/usr/bin/env python3
"""接收 GoAccess WebSocket 实时数据"""
import asyncio
import websockets
import json
async def monitor():
uri = "ws://localhost:7890"
async with websockets.connect(uri) as websocket:
while True:
data = await websocket.recv()
stats = json.loads(data)
total = stats['general']['total_requests']
visitors = stats['general']['unique_visitors']
print(f"请求总数: {total} | 独立访客: {visitors}")
# 获取状态码分布
for code in stats.get('status_codes', []):
print(f" {code['data']}: {code['hits']['count']} 次")
asyncio.run(monitor())
5.7.3 用 Node.js 接收实时数据
const WebSocket = require('ws');
const ws = new WebSocket('ws://localhost:7890');
ws.on('open', () => {
console.log('已连接到 GoAccess WebSocket');
});
ws.on('message', (data) => {
const stats = JSON.parse(data);
console.log(`请求总数: ${stats.general.total_requests}`);
console.log(`独立访客: ${stats.general.unique_visitors}`);
});
ws.on('error', (err) => {
console.error('WebSocket 错误:', err.message);
});
5.8 安全注意事项
5.8.1 WebSocket 安全
| 风险 | 描述 | 缓解措施 |
|---|---|---|
| 未授权访问 | WebSocket 默认无认证 | 使用 WSS + 反向代理 + 认证 |
| 数据泄露 | 日志数据包含敏感信息 | 使用 HTTPS/WSS 加密传输 |
| DoS 攻击 | 大量连接消耗资源 | 限制来源、使用防火墙 |
| 端口暴露 | WebSocket 端口对外暴露 | 通过反向代理隐藏端口 |
5.8.2 推荐的安全配置
# 1. 仅监听本地
# GoAccess 默认只监听 localhost,不要修改为 0.0.0.0
# 2. 使用 WSS(加密)
tail -f access.log | goaccess --log-format=COMBINED \
-o report.html --real-time-html \
--ssl-cert=/etc/goaccess/cert.pem \
--ssl-key=/etc/goaccess/key.pem \
--ws-url=wss://stats.example.com/ws
# 3. Nginx 反向代理 + Basic Auth
# 见 5.3.5 节的 Nginx 配置,添加:
# auth_basic "GoAccess";
# auth_basic_user_file /etc/nginx/.htpasswd;
5.9 常见问题排查
问题一:HTML 面板数据不更新
# 检查 WebSocket 连接状态(浏览器控制台)
# 打开浏览器开发者工具 → Console
# 应看到 WebSocket 连接成功的日志
# 检查端口是否被占用
ss -tlnp | grep 7890
# 检查防火墙
sudo ufw status
sudo iptables -L -n | grep 7890
# 确保 HTML 中的 ws-url 正确
grep ws report.html
问题二:WebSocket 连接被拒绝
# 检查 GoAccess 进程是否在运行
ps aux | grep goaccess
# 检查端口监听
netstat -tlnp | grep 7890
# 如果在 Docker 中运行,确保端口映射
docker run -p 7890:7890 ...
问题三:终端面板卡顿
# 减少启用的面板数量
tail -f access.log | goaccess --log-format=COMBINED \
--ignore-panel=GEO_LOCATION \
--ignore-panel=ASN \
-
# 使用 --no-color
tail -f access.log | goaccess --log-format=COMBINED --no-color -
5.10 小结
| 模式 | 命令 | 适用场景 |
|---|---|---|
| 终端实时 | tail -f log | goaccess --format - | SSH 运维、本地调试 |
| HTML 实时 | tail -f log | goaccess -o html --real-time-html - | 团队共享、远程监控 |
| WSS 加密 | 添加 --ssl-cert/key + --ws-url=wss:// | 生产环境 |
| 反向代理 | Nginx 代理 WebSocket | 隐藏端口、HTTPS 统一入口 |
| systemd 托管 | 创建 .service 文件 | 生产环境自动化运维 |
下一章
下一章将深入讲解 HTML 报告的高级用法,包括自定义样式、图表配置、自动化生成和分享策略。