服务器跑着,Nginx 每天生成一堆访问日志,但大部分时候没人去看。等出问题了才翻出来逐行 grep、awk、tail -f,找个 IP 折腾半天。
nginxpulse 是一个轻量的 Nginx 访问日志分析面板——Docker 一条命令拉起来,自动解析日志,图表展示 PV/UV、IP 归属地、状态码分布、客户端占比。
nginxpulse Logo
ELK 能力强但吃资源(内存至少几个 G),个人服务器扛不住。GoAccess 功能成熟但上手有门槛。Prometheus + Nginx Exporter 偏进程监控,对访问日志的分析维度有限。
nginxpulse 卡在中间位置:比 GoAccess 上手快,比 ELK 轻得多。适合不需要复杂日志管道、只想快速看清网站访问情况 的场景。
技术栈:Go(Gin) + Vue 3 + TypeScript + ECharts,数据库 PostgreSQL(1.5.3 后已从 SQLite 迁移),IP 归属地用 ip2region + ip-api.com。Docker 镜像内置 PostgreSQL,不用单独装。
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
- 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
- 视频教程:https://doc.iocoder.cn/video/
PV / UV 统计 :首次启动解析全量历史日志入库,之后持续监听新日志。统计维度:总 PV、UV、QPS、响应时间分布。默认排除内网 IP。
IP 归属地 :先查本地 ip2region,查不到再请求 ip-api.com,结果缓存避免重复查询。页面偶尔显示"待解析"是正常的,后台任务还没跑完。
状态码分布 :2xx/3xx/4xx/5xx 占比一目了然。4xx 飙高 → 有人扫路径或资源链接挂了;5xx 高 → 应用层出问题。
客户端解析 :浏览器、操作系统、移动端/桌面端占比,个人站长可以指导移动端适配优先级。
实时流量 :当前请求实时滚动,适合压测时盯着看或发版时确认流量正常。
数据日报 :按天汇总,可对比不同日期的访问量变化。
nginxpulse 面板概览
nginxpulse 面板详情移动端有 /m 入口,支持概览、日报、实时、日志四个页面。但首次初始化必须在电脑上完成。
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
- 项目地址:https://github.com/YunaiV/yudao-cloud
-
视频教程:https://doc.iocoder.cn/video/
docker run -d --name nginxpulse \
-p 8088:8088 \
-v ./docker_local/logs:/share/logs:ro \
-v ./docker_local/nginxpulse_data:/app/var/nginxpulse_data \
-v ./docker_local/pgdata:/app/var/pgdata \
-v ./docker_local/configs:/app/configs \
-v /etc/localtime:/etc/localtime:ro \
magiccoders/nginxpulse:latest
| |
|---|
/share/logs | |
/app/var/nginxpulse_data | |
/app/var/pgdata | |
/app/configs | |
/etc/localtime | |
启动后访问 http://IP:8088。时区一定要设置 ,否则日志时间解析偏差,统计数据全乱。
services:
nginxpulse:
image:magiccoders/nginxpulse:latest
container_name:local_nginxpulse
ports:
-"8088:8088"
-"8089:8089"
volumes:
-./docker_local/logs:/share/logs
-./docker_local/nginxpulse_data:/app/var/nginxpulse_data
-./docker_local/pgdata:/app/var/pgdata
-./docker_local/configs:/app/configs
-/etc/localtime:/etc/localtime
stop_grace_period:90s
restart:unless-stopped
stop_grace_period: 90s 不能省——内置 PostgreSQL 关闭时需要时间落盘,不给够会导致下次启动走恢复流程。
docker compose up -d
从 GitHub Releases 下载,直接运行。1.5.3 后需自备 PostgreSQL,在配置文件里填 database.dsn。
TZ=Asia/Shanghai ./nginxpulse
一台服务器跑多个站点时,把日志目录整体挂进去,配置里分别指定:
[
{"name": "站点A", "logPath": "/share/log/nginx/access-site-a.log", "domains": ["a.example.com"]},
{"name": "站点B", "logPath": "/share/log/nginx/access-site-b.log", "domains": ["b.example.com"]}
]
压缩日志直接支持,logPath 可指向 .gz 文件或通配符:
{"logPath": "/share/log/nginx/access-*.log.gz"}
历史日志不用解压,直接拿来用。
nginxpulse 默认以非 root 用户运行。容器内能否读日志、写数据,取决于宿主机目录权限。
# 查看 UID/GID
ls -n /path/to/logs /path/to/nginxpulse_data
# 启动时传入
docker run ... -e PUID=1000 -e PGID=1000 ...
# 确保权限
chown -R 1000:1000 /path/to/nginxpulse_data /path/to/pgdata
chmod -R u+rx /path/to/logs
RHEL/CentOS/Fedora 开了 SELinux 的,volume 后面加
:z 或 :Z:
-v /path/to/logs:/var/log/nginx:ro,Z
不要 chmod 777 ——只能临时排查用,不适合生产。
| | |
|---|
| | |
| | 把 PV_EXCLUDE_IPS 设为空,重新解析 |
| | |
| | 按 logRetentionDays 清理,默认 30 天 |
| | |
|---|
| nginxpulse | | |
| GoAccess | | |
| ELK | | |
| Prometheus + Grafana | | |
开源地址:https://github.com/likaia/nginxpulse
文档站点:https://nginx-pulse-docs.kaisir.cn/