强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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标准默认方案
1Monokai暗色终端
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 会:

  1. 生成 report.html 文件
  2. 启动一个 WebSocket 服务器(默认端口 7890)
  3. 在终端中保持运行,等待日志输入
  4. 浏览器打开 HTML 文件后通过 WebSocket 接收实时数据

5.3.2 WebSocket 通信原理

┌────────────┐     WebSocket      ┌─────────────────┐
│  浏览器     │◄─────────────────►│  GoAccess        │
│  (HTML页面) │   ws://host:7890  │  (WS 服务端)      │
└────────────┘                    └─────────────────┘
                                        ↑
                                        │ 解析数据
                                        │
                                  ┌───────────────┐
                                  │ tail -f log   │
                                  │ (日志输入)     │
                                  └───────────────┘

数据流:

  1. 日志文件持续写入新记录
  2. tail -f 捕获新记录并通过管道传给 GoAccess
  3. GoAccess 解析新记录,更新内部统计
  4. 通过 WebSocket 将更新后的数据推送到所有连接的浏览器
  5. 浏览器 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=URLWebSocket 连接地址ws://localhost:7890
--ssl-cert=FILESSL 证书文件
--ssl-key=FILESSL 私钥文件
--origin=URL允许的 CORS 来源不限制
--fifo-in=PATHFIFO 管道输入
--fifo-out=PATHFIFO 管道输出

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 秒 推送一次更新数据。这基于以下机制:

  1. GoAccess 每收到一条新日志记录就更新内部统计
  2. WebSocket 推送的频率取决于新日志的产生频率
  3. 浏览器面板的 UI 刷新频率由 JavaScript 控制

5.4.2 性能考虑

场景每秒日志量CPU 占用内存占用
小型网站< 10 条/s< 1%~ 20 MB
中型网站10-100 条/s1-3%~ 50 MB
大型网站100-1000 条/s3-8%~ 100 MB
超大流量> 1000 条/s8-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 报告的高级用法,包括自定义样式、图表配置、自动化生成和分享策略。

06 - HTML 报告


扩展阅读