轻量级的 Nginx 日志分析面板。
实时看 PV/UV 数据
IP 归属地查询(国内用 ip2region 本地库,国外走 ip-api)
客户端/浏览器解析
支持多站点
支持自定义日志格式
后端是 Go + Gin,前端是 Vue3 + Vite + PrimeVue,数据库就一个 SQLite,够轻量。
docker 运行:
dockerrun -d --name nginxpulse\-p8088:8088\-p8089:8089\-eWEBSITES='[{"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,也行:
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 传数组就行:
WEBSITES='[ {"name":"主站","logPath":"/logs/main.log","domains":["www.example.com"]}, {"name":"博客","logPath":"/logs/blog.log","domains":["blog.example.com"]} ]'日志按天切割的话,支持通配符:
{"logPath":"/logs/access-*.log"}.gz 压缩日志也能直接解析,不用手动解压。
几个实用功能
- 远端日志拉取
日志不在本机?没关系,支持 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"}Push Agent
如果服务器在内网或者边缘节点,可以用 Agent 主动推送日志。在日志服务器上跑一个轻量 agent,实时把日志推到 NginxPulse 主服务。自定义日志格式
不是默认的 combined 格式?可以自定义。支持两种方式:
方式一:直接写 log_format 语法
{"logFormat":"$remote_addr-$remote_user[$time_local]\"$request\"$status$body_bytes_sent"}方式二:正则(命名分组)
{"logRegex":"^(?P<ip>\\S+) - (?P<user>\\S+)\\[(?P<time>[^\\]]+)\\]..."}Caddy 也支持
用 Caddy 的朋友也能用,配置 logType: “caddy” 就行,会按 JSON 格式解析。访问控制
生产环境可以加个密钥:
ACCESS_KEYS='["your-secret-key"]'访问时需要带上 X-NginxPulse-Key 请求头,前端会自动弹窗让你输入。
常见问题
Q:跑起来后日志明细是空的?
A:多半是权限问题。给日志目录和数据目录加个权限:
chmod-R777/path/to/logs /path/to/nginxpulse_dataQ:有访问但是 PV/UV 都是 0?
A:默认排除内网 IP。如果想统计内网流量,把 PV_EXCLUDE_IPS 设成空数组:
PV_EXCLUDE_IPS='[]'单体部署
如果不想用 Docker,可以构建成单个可执行文件:
./scripts/build_single.sh会生成一个内置前端的二进制文件,直接运行就能同时提供前后端服务。支持 amd64 和 arm64。
最后
GitHub 地址:
https://github.com/likaia/nginxpulse在线演示:
https://nginx-pulse.kaisir.cn/