1. GoAccess概述
1.1 什么是GoAccess
GoAccess是一个开源的实时Web日志分析器和交互式查看器,运行在终端或通过浏览器。它为系统管理员提供快速且有价值的HTTP统计信息,用于实时监控Web服务器。
1.2 主要特性
- 实时分析:支持实时日志分析和监控
- 多种输出格式:终端、HTML、JSON、CSV等
- 丰富的统计信息:访问者、请求、静态请求、404错误等
- 地理位置信息:支持GeoIP数据库
- 高性能:使用C语言编写,处理速度快
- 跨平台:支持Linux、macOS、Windows等
- 配置灵活:支持自定义日志格式
1.3 应用场景
- Web服务器日志分析
- 实时流量监控
- 安全事件分析
- 性能问题诊断
- 用户行为分析
2. 系统要求
2.1 硬件要求
# 最低配置
CPU: 1核心
内存: 512MB
磁盘: 100MB可用空间
# 推荐配置(大型网站)
CPU: 4核心以上
内存: 4GB以上
磁盘: 1GB以上可用空间
2.2 软件依赖
# 编译依赖
sudo apt-get update
sudo apt-get install build-essential
sudo apt-get install libncurses5-dev
sudo apt-get install libgeoip-dev
sudo apt-get install libtokyocabinet-dev
# 可选依赖
sudo apt-get install libssl-dev # HTTPS支持
sudo apt-get install zlib1g-dev # 压缩支持
3. 安装方式
3.1 包管理器安装
Ubuntu/Debian
# 更新包列表
sudo apt-get update
# 安装GoAccess
sudo apt-get install goaccess
# 验证安装
goaccess --version
CentOS/RHEL
# 启用EPEL仓库
sudo yum install epel-release
# 安装GoAccess
sudo yum install goaccess
# 或使用dnf(CentOS 8+)
sudo dnf install goaccess
macOS
# 使用Homebrew
brew install goaccess
# 使用MacPorts
sudo port install goaccess
3.2 源码编译安装
#!/bin/bash
# GoAccess源码编译安装脚本
# 设置版本
VERSION="1.7.1"
WORKDIR="/tmp/goaccess-build"
# 创建工作目录
mkdir -p $WORKDIR
cd $WORKDIR
# 下载源码
wget https://tar.goaccess.io/goaccess-${VERSION}.tar.gz
tar -xzf goaccess-${VERSION}.tar.gz
cd goaccess-${VERSION}
# 配置编译选项
./configure --enable-utf8 \
--enable-geoip=legacy \
--with-openssl \
--enable-debug
# 编译和安装
make
sudo make install
# 验证安装
goaccess --version
# 清理临时文件
cd /
rm -rf $WORKDIR
echo "GoAccess安装完成!"
3.3 Docker安装
# 拉取官方镜像
docker pull allinurl/goaccess
# 运行容器
docker run --rm -it \
-v /var/log/nginx:/opt/log \
-v /tmp/goaccess:/opt/goaccess \
allinurl/goaccess \
/opt/log/access.log
Docker Compose配置
# docker-compose.yml
version: '3.8'
services:
goaccess:
image: allinurl/goaccess:latest
container_name: goaccess
volumes:
- /var/log/nginx:/opt/log:ro
- ./goaccess-data:/opt/goaccess
- ./goaccess.conf:/etc/goaccess/goaccess.conf:ro
ports:
- "7890:7890"
command: >
goaccess /opt/log/access.log
--log-format=COMBINED
--real-time-html
--ws-url=ws://localhost:7890
--port=7890
--addr=0.0.0.0
restart: unless-stopped
4. 基础配置
4.1 配置文件位置
# 系统配置文件
/etc/goaccess/goaccess.conf
# 用户配置文件
~/.goaccessrc
# 当前目录配置文件
./goaccess.conf
4.2 基础配置示例
# /etc/goaccess/goaccess.conf
# 时间格式
time-format %H:%M:%S
# 日期格式
date-format %d/%b/%Y
# 日志格式(Apache Combined)
log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"
# 启用实时HTML输出
real-time-html true
# WebSocket端口
port 7890
# 绑定地址
addr 0.0.0.0
# 输出文件
output /var/www/html/goaccess.html
# 启用GeoIP
geoip-database /usr/share/GeoIP/GeoIP.dat
# 忽略的IP地址
ignore-panel HOSTS
ignore-panel OS
# 静态文件扩展名
static-file .css
static-file .js
static-file .jpg
static-file .png
static-file .gif
static-file .ico
static-file .jpeg
static-file .pdf
static-file .txt
static-file .zip
4.3 日志格式配置
# Nginx默认格式
log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"
# Apache Common格式
log-format %h %^ %^ [%d:%t %^] "%r" %s %b
# Apache Combined格式
log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"
# 自定义格式示例
log-format %h %^ %^ [%d:%t %^] "%r" %s %b "%R" "%u" %T
5. 快速开始
5.1 基本使用
# 分析Apache访问日志
goaccess /var/log/apache2/access.log
# 分析Nginx访问日志
goaccess /var/log/nginx/access.log
# 指定日志格式
goaccess /var/log/nginx/access.log --log-format=COMBINED
# 生成HTML报告
goaccess /var/log/nginx/access.log -o report.html
5.2 实时监控
# 实时监控(终端)
goaccess /var/log/nginx/access.log --real-time
# 实时HTML报告
goaccess /var/log/nginx/access.log \
--real-time-html \
--ws-url=ws://localhost:7890 \
--port=7890 \
--addr=0.0.0.0 \
-o /var/www/html/goaccess.html
5.3 多文件分析
# 分析多个日志文件
goaccess /var/log/nginx/access.log* \
--log-format=COMBINED \
-o report.html
# 分析压缩日志
zcat /var/log/nginx/access.log.*.gz | \
goaccess --log-format=COMBINED -o report.html
6. 安装验证
6.1 功能测试脚本
#!/usr/bin/env python3
# goaccess_test.py - GoAccess安装验证脚本
import subprocess
import sys
import os
import tempfile
from datetime import datetime
def run_command(cmd):
"""执行命令并返回结果"""
try:
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
return result.returncode == 0, result.stdout, result.stderr
except Exception as e:
return False, "", str(e)
def check_goaccess_version():
"""检查GoAccess版本"""
print("检查GoAccess版本...")
success, stdout, stderr = run_command("goaccess --version")
if success:
print(f"✓ GoAccess已安装: {stdout.strip()}")
return True
else:
print(f"✗ GoAccess未安装或无法运行: {stderr}")
return False
def create_test_log():
"""创建测试日志文件"""
test_log = """
127.0.0.1 - - [25/Dec/2023:10:00:01 +0000] "GET / HTTP/1.1" 200 1234 "-" "Mozilla/5.0"
127.0.0.1 - - [25/Dec/2023:10:00:02 +0000] "GET /about HTTP/1.1" 200 5678 "-" "Mozilla/5.0"
192.168.1.100 - - [25/Dec/2023:10:00:03 +0000] "GET /contact HTTP/1.1" 404 0 "-" "Mozilla/5.0"
10.0.0.1 - - [25/Dec/2023:10:00:04 +0000] "POST /api/data HTTP/1.1" 500 0 "-" "curl/7.68.0"
"""
temp_file = tempfile.NamedTemporaryFile(mode='w', suffix='.log', delete=False)
temp_file.write(test_log)
temp_file.close()
return temp_file.name
def test_basic_analysis(log_file):
"""测试基本分析功能"""
print("测试基本分析功能...")
cmd = f'goaccess {log_file} --log-format=COMBINED --no-color'
success, stdout, stderr = run_command(cmd)
if success and "Total Requests" in stdout:
print("✓ 基本分析功能正常")
return True
else:
print(f"✗ 基本分析功能异常: {stderr}")
return False
def test_html_output(log_file):
"""测试HTML输出功能"""
print("测试HTML输出功能...")
output_file = tempfile.NamedTemporaryFile(suffix='.html', delete=False)
output_file.close()
cmd = f'goaccess {log_file} --log-format=COMBINED -o {output_file.name}'
success, stdout, stderr = run_command(cmd)
if success and os.path.exists(output_file.name) and os.path.getsize(output_file.name) > 0:
print(f"✓ HTML输出功能正常,文件: {output_file.name}")
os.unlink(output_file.name)
return True
else:
print(f"✗ HTML输出功能异常: {stderr}")
if os.path.exists(output_file.name):
os.unlink(output_file.name)
return False
def test_json_output(log_file):
"""测试JSON输出功能"""
print("测试JSON输出功能...")
cmd = f'goaccess {log_file} --log-format=COMBINED --json-pretty-print'
success, stdout, stderr = run_command(cmd)
if success and '"general"' in stdout:
print("✓ JSON输出功能正常")
return True
else:
print(f"✗ JSON输出功能异常: {stderr}")
return False
def main():
"""主函数"""
print("GoAccess安装验证开始...")
print("=" * 50)
# 检查版本
if not check_goaccess_version():
print("\n安装验证失败:GoAccess未正确安装")
sys.exit(1)
# 创建测试日志
log_file = create_test_log()
print(f"\n创建测试日志文件: {log_file}")
try:
# 测试各项功能
tests = [
test_basic_analysis,
test_html_output,
test_json_output
]
passed = 0
total = len(tests)
for test in tests:
if test(log_file):
passed += 1
print()
# 输出结果
print("=" * 50)
print(f"测试完成: {passed}/{total} 项测试通过")
if passed == total:
print("✓ GoAccess安装验证成功!")
else:
print("✗ 部分功能测试失败,请检查安装")
sys.exit(1)
finally:
# 清理测试文件
if os.path.exists(log_file):
os.unlink(log_file)
if __name__ == "__main__":
main()
6.2 运行验证
# 运行验证脚本
python3 goaccess_test.py
# 手动验证
goaccess --version
goaccess --help
7. 常见问题
7.1 编译问题
# 缺少依赖
sudo apt-get install build-essential libncurses5-dev
# GeoIP支持
sudo apt-get install libgeoip-dev
# SSL支持
sudo apt-get install libssl-dev
7.2 权限问题
# 日志文件权限
sudo chmod 644 /var/log/nginx/access.log
sudo chown www-data:adm /var/log/nginx/access.log
# 输出目录权限
sudo mkdir -p /var/www/html/goaccess
sudo chown www-data:www-data /var/www/html/goaccess
7.3 性能问题
# 大文件处理
goaccess /var/log/nginx/access.log --no-progress
# 内存限制
ulimit -m 2097152 # 2GB内存限制
8. 下一步
安装完成后,您可以:
- 学习基本配置和使用方法
- 了解各种日志格式的配置
- 掌握实时监控功能
- 学习HTML报告生成
- 探索高级分析功能
下一章我们将详细介绍GoAccess的基本配置和使用方法。