找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1783

积分

0

好友

231

主题
发表于 4 小时前 | 查看: 3| 回复: 0

对于运维工程师或个人服务器管理员来说,监控网站访问情况是一个常见需求。

此前,你可能尝试过 GoAccess、ELK Stack 等方案,它们要么配置过程繁琐,要么体系过于庞大。最近,我发现了一个名为 NginxPulse 的开源项目,实际体验下来感觉相当不错,值得分享。

NginxPulse 是什么?

简单来说,它是一个轻量级的 Nginx 日志分析可视化面板

主要功能包括:

  • 实时查看 PV(页面浏览量)、UV(独立访客)等核心数据。
  • 查询 IP 归属地(国内使用 ip2region 本地库,国外调用 ip-api 接口)。
  • 解析客户端设备与浏览器信息。
  • 支持同时监控多个网站或服务。
  • 支持自定义日志格式。

来看一下它的实际效果:

NginxPulse 实时监控仪表盘界面

NginxPulse 每日分析报告详情页

技术栈与设计

项目后端采用 Go 语言和 Gin 框架编写,前端基于 Vue3 + Vite + PrimeVue 构建,数据存储仅使用一个 SQLite 数据库,整体设计非常轻量。

其 IP 归属地查询逻辑设计得较为巧妙:优先查询内存缓存,未命中则通过远程 API 批量查询以提高效率,若 API 请求失败则回退至本地 ip2region 数据库。这套策略在保证查询速度的同时,也兼顾了准确率。

如何快速部署

使用 Docker 快速启动

这是最简单的方式,一行命令即可完成部署:

docker run -d --name nginxpulse \
  -p 8088:8088 \
  -p 8089:8089 \
  -e WEBSITES='[{"name":"主站","logPath":"/share/log/nginx/access.log","domains":["example.com"]}]' \
  -v /your/nginx/logs/access.log:/share/log/nginx/access.log:ro \
  -v $(pwd)/var/nginxpulse_data:/app/var/nginxpulse_data \
  magiccoders/nginxpulse:latest

请将命令中的 /your/nginx/logs/access.log 替换为你服务器上 Nginx 访问日志的实际路径。

使用 Docker Compose

如果你更习惯使用 Docker Compose,可以创建如下配置文件:

version: "3.8"
services:
  nginxpulse:
    image: magiccoders/nginxpulse:latest
    container_name: nginxpulse
    ports:
      - "8088:8088"
      - "8089:8089"
    environment:
      WEBSITES: '[{"name":"主站","logPath":"/share/log/nginx/access.log","domains":["example.com"]}]'
    volumes:
      - ./nginx_logs/access.log:/share/log/nginx/access.log:ro
      - ./var/nginxpulse_data:/app/var/nginxpulse_data
    restart: unless-stopped

启动成功后,可以通过以下地址访问:

  • 前端管理面板:http://你的服务器IP:8088
  • 后端 API 接口:http://你的服务器IP:8089

配置多站点监控

如果你需要监控多个网站,只需将 WEBSITES 环境变量配置为一个数组即可:

WEBSITES='[
  {"name":"主站","logPath":"/logs/main.log","domains":["www.example.com"]},
  {"name":"博客","logPath":"/logs/blog.log","domains":["blog.example.com"]}
]'

对于按日期切割的日志文件(例如 access-20231001.log),NginxPulse 支持通配符匹配:

{"logPath": "/logs/access-*.log"}

此外,它还能直接解析 .gz 格式的压缩日志文件,无需手动解压。

核心功能详解

1. 拉取远端服务器日志

如果日志文件不在 NginxPulse 所在的机器上,它支持通过 SFTP、HTTP 或 S3/OSS 对象存储协议拉取远端日志。

例如,配置一个 SFTP 源:

{
  "id": "sftp-main",
  "type": "sftp",
  "host": "1.2.3.4",
  "port": 22,
  "user": "nginx",
  "auth": { "keyFile": "/secrets/id_rsa" },
  "path": "/var/log/nginx/access.log"
}

2. Push Agent 模式

对于位于内网或边缘节点的服务器,可以采用 Agent 主动推送模式。在日志源服务器上运行一个轻量的 Agent 程序,即可实时将日志推送到中心的 NginxPulse 服务进行分析。

3. 解析自定义日志格式

如果你的 Nginx 日志并非默认的 combined 格式,NginxPulse 提供了两种自定义解析方式:

方式一:直接使用 Nginx 的 log_format 语法

{
  "logFormat": "$remote_addr - $remote_user [$time_local] \"$request\" $status $body_bytes_sent"
}

方式二:使用正则表达式(支持命名分组)

{
  "logRegex": "^(?P<ip>\\S+) - (?P<user>\\S+) \\[(?P<time>[^\\]]+)\\]..."
}

4. 支持 Caddy 服务器

使用 Caddy 服务器的用户同样可以受益。只需在网站配置中指定 "logType": "caddy",NginxPulse 便会按照 Caddy 的 JSON 日志格式进行解析。

5. 访问控制与安全

在生产环境部署时,建议启用访问密钥认证以提高安全性:

ACCESS_KEYS='["your-secret-key"]'

启用后,访问前端面板或调用 API 时需在请求头中携带 X-NginxPulse-Key: your-secret-key。前端界面会自动弹出密钥输入框。

常见问题排查

Q:服务运行后,日志明细页面为何为空?
A:这通常是文件权限问题所致。请确保 NginxPulse 容器有权限读取日志文件和数据目录。可以尝试执行以下命令(请根据实际情况调整路径):

chmod -R 777 /path/to/logs /path/to/nginxpulse_data

Q:明明有访问记录,但面板上显示的 PV/UV 始终为 0?
A:NginxPulse 默认会排除内网 IP 地址的访问统计。如果你需要统计内网流量,可以将 PV_EXCLUDE_IPS 环境变量设置为空数组:

PV_EXCLUDE_IPS='[]'

单体二进制文件部署

如果你不希望依赖 Docker 环境,也可以将 NginxPulse 构建为单一的可执行文件:

./scripts/build_single.sh

该脚本会生成一个内嵌了前端资源的二进制文件,直接运行即可同时提供前后端服务。目前支持 amd64 和 arm64 架构。

总结与项目信息

NginxPulse 是一个在 GitHub 上开源的项目,采用 MIT 协议,目前获得了超过 1.2k 的 Star。它定位清晰,在功能强大的 ELK Stack 和轻便但仅限命令行的 GoAccess 之间,提供了一个不错的折中选择。

如果你正在寻找一个部署简单、界面直观、功能实用的 Nginx 日志分析方案,不妨试试 NginxPulse。对于更复杂的监控需求或希望与其他运维、开发同行交流经验,也欢迎到 云栈社区 的相关板块进行探讨。




上一篇:PHP安全核心机制详解:代码审计、漏洞防范与实战
下一篇:AI Agent实战指南:从Rules到Skills,如何用确定性技能消除大模型幻觉?
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-28 23:20 , Processed in 0.486545 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表