终于找到一个好用的 Nginx 日志分析工具了!

搞运维或者自己折腾服务器的朋友应该都有这个需求:想看看自己网站的访问情况

之前试过 GoAccess、ELK 那一套,要么配置麻烦,要么太重量级。最近发现了一个叫 NginxPulse** 的项目,用下来感觉还不错,分享给大家。

这是啥?

一句话:轻量级的 Nginx 日志分析面板

能干啥:

  • 实时看 PV/UV 数据
  • IP 归属地查询(国内用 ip2region** 本地库,国外走 ip-api)
  • 客户端/浏览器解析
  • 支持多站点
  • 支持自定义日志格式

看下效果图:

技术栈

后端是 Go + Gin,前端是 Vue3 + Vite + PrimeVue**,数据库就一个 SQLite,够轻量。

IP 归属地这块挺聪明的:先查内存缓存,然后走远程 API 批量查,失败了再用本地 ip2region 兜底。既保证速度又保证准确率。

怎么跑起来

Docker 一把梭

最简单的方式,一行命令搞定:

less 复制代码
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 换成你自己的日志路径就行。

Docker Compose

如果喜欢 compose,也行:

makefile 复制代码
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://localhost:8088
  • 后端 API:http://localhost:8089

多网站怎么配?

如果你有多个站点,WEBSITES 传数组就行:

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

日志按天切割的话,支持通配符:

json 复制代码
{"logPath": "/logs/access-*.log"}

.gz 压缩日志也能直接解析,不用手动解压。

几个实用功能

1. 远端日志拉取

日志不在本机?没关系,支持 SFTP、HTTP、S3/OSS 三种方式拉取远端日志。

比如 SFTP:

json 复制代码
{
  "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. 自定义日志格式

不是默认的 combined 格式?可以自定义。支持两种方式:

方式一:直接写 log_format 语法

bash 复制代码
{
  "logFormat": "$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent"
}

方式二:正则(命名分组)

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

4. Caddy 也支持

用 Caddy 的朋友也能用,配置 logType: "caddy" 就行,会按 JSON 格式解析。

5. 访问控制

生产环境可以加个密钥:

ini 复制代码
ACCESS_KEYS='["your-secret-key"]'

访问时需要带上 X-NginxPulse-Key 请求头,前端会自动弹窗让你输入。

常见问题

Q:跑起来后日志明细是空的? A:多半是权限问题。给日志目录和数据目录加个权限:

bash 复制代码
chmod -R 777 /path/to/logs /path/to/nginxpulse_data

Q:有访问但是 PV/UV 都是 0? A:默认排除内网 IP。如果想统计内网流量,把 PV_EXCLUDE_IPS 设成空数组:

ini 复制代码
PV_EXCLUDE_IPS='[]'

单体部署

如果不想用 Docker,可以构建成单个可执行文件:

bash 复制代码
./scripts/build_single.sh

会生成一个内置前端的二进制文件,直接运行就能同时提供前后端服务。支持 amd64 和 arm64。

相关推荐
糟糕好吃12 小时前
我让 AI 操作网页之后,开始不想点按钮了
前端·javascript·后端
leonkay13 小时前
Golang语言闭包完全指南
开发语言·数据结构·后端·算法·架构·golang
颜酱13 小时前
BFS 与并查集实战总结:从基础框架到刷题落地
javascript·后端·算法
无限大614 小时前
数字生存02:如何在信息爆炸的时代保持清醒,不被算法控制
后端
无限大614 小时前
AI实战02:一个万能提示词模板,搞定90%的文案/设计/分析需求
前端·后端
青柠代码录14 小时前
【Linux】脚本:console.log 日志定期备份清理
后端
陈随易15 小时前
站在普通开发者的角度,我觉得 RollCode 更像是“把 H5 交付这件事重新捋顺了”
前端·后端·程序员
陈随易15 小时前
RollCode:不只是在做页面,而是在缩短“从需求到上线”的整条链路
前端·后端
y = xⁿ15 小时前
【LeetCodehot100】二叉树大合集 T94:二叉树的中序遍历 T104:二叉树的最大深度 T226:翻转二叉树 T101:对称二叉树
后端·算法·深度优先
2501_9216494915 小时前
美股历史 K线数据 API接口综合评测与接入指南
后端·python·websocket·金融·restful