最近在优化网站访问链路的过程中,部署了一套 WAF 防火墙,它大部分功能都做的挺好,美中不足的地方就是针对于网站访客的相关功能需要付费( 3600 元/年)才能用。
付费是不可能付费的,找了一圈 nginx 日志分析的开源项目,大部分都做的挺简陋的,要么就是做的很重,需要部署其他服务。
既然找不到合适的,那就自己动手写一个吧!
如果看不到图片的话,直接访问我个人网站上发布的。https://www.kaisir.cn/post/186
做了 4 个模块对日志数据进行分析。

概况模块中,做了 8 个维度的数据分析。
在这个维度中,针对 http 状态码、浏览量、访客数、会话数做了更细致的划分。

每一个划分中,在详情面板里,都可以看到这个访客在什么时间做了什么事情。




这一部分可以看到每天的访问趋势以及当天与前一天的新老访客占比。

这部分可以看到访客的来源,以及每个路径的访问次数。

这部分可以看到每个省份的访问情况以及访问设备的分布情况。

在这个模块中,可以看到每天的浏览量、访客数、平均访问时长等信息。


在这个模块里,可以查看最近 5/15/30 分钟内的访问情况

这个模块就以表格的形式展示每一条日志。

为了方便使用,我已经将这个项目打包成镜像发布到 dockerhub 上了,镜像名为magiccoders/nginxpulse,可以通过 docker 的形式使用,也可以通过 docker compose 的形式使用。
需要传入的参数:
此处我以 docker compose 的形式举例:
version: "3"
services:
nginxpulse:
image: magiccoders/nginxpulse:latest
container_name: local_nginxpulse
ports:
- "9200:8088"
environment:
WEBSITES: '[{"name":"神奇的程序员","logPath":"/var/log/nginx/access.log","domains":["kaisir.cn","www.kaisir.cn"]}]' #domains 用于“来源( referer )统计”的站内/站外分类
PV_EXCLUDE_IPS: '["127.0.0.1", "::1", "10.10.0.1", "192.168.30.21"]' #pv 统计时需要排除的 ip
volumes:
- ./nginx_data/logs/all/access.log:/var/log/nginx/access.log
- ./nginxpulse_data:/app/nginxpulse_data
- /etc/localtime:/etc/localtime
restart: unless-stopped
至此,文章就分享完毕了。
我是神奇的程序员,一位前端开发工程师。
如果你对我感兴趣,请移步我的个人网站,进一步了解。
1
NouveauNom 2 天前
建议加入一个查看 url 记录,请求时长,包体,请求内容。就像抓包软件那样,可以方便排查接口问题,哪里卡了之类的。之前见某家的 cdn 有这个功能。很强。后面自己找没找到合适的。
|
2
4ark 2 天前
看着挺不错,以后有需要可以接一下
|
3
4ark 2 天前
PS:会考虑开源吗?
|
4
MagicCoder OP @4ark 晚点开源,现在代码写的比较乱,我得先整理下
|
5
MagicCoder OP @NouveauNom 可以,我晚点看看
|
6
Daybyedream 2 天前
我们是日志发到日志服务器里,grafana 加个数据源,要啥自己弄就完事。
|
8
renchong 2 天前
楼主用的什么 waf 防火墙
|
9
MagicCoder OP @renchong 就雷池😂
|
10
lneoi 2 天前
挺漂亮的
|
11
wbrobot 2 天前
goaccess 用过吗?
|
12
MagicCoder OP @wbrobot 之前搜到过,看到那个 UI 太古老了😂
|
13
alenryuichi 2 天前
挺不错的 赞
|
14
stinkytofux 2 天前
@MagicCoder #9 雷池收费的地方太多了, 基本上点啥都要收费. 还有没有其他可以平替的.
|
15
MagicCoder OP @stinkytofux 😂没找到能平替的 现在感觉他能防住一些攻击就够了
|
16
mgcnrx11 2 天前
好漂亮。有个问题,一个 nginx 反向代理了多个网址。日志可以区分吗?
|
17
MagicCoder OP @mgcnrx11 这个在 nginx 里主动记录进日志应该就能区分了
|
18
FeranyDev 2 天前
nginx 输出的日志有什么格式要求吗,我这个好像获取不到日志。
|
19
bpf2049 2 天前
🐮,同使用雷池,期待开源
|
20
MagicCoder OP @FeranyDev 不能自己定义格式,需要保持他的默认规则 像这样:
4.213.160.187 - - [31/Dec/2025:15:40:45 +0800] "GET /wp-includes/index.php HTTP/1.1" 404 41912 "https://www.google.fr/" "Mozilla/5.0 (Linux; Android 13; SM-S908E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36" 4.213.160.187 - - [31/Dec/2025:15:40:46 +0800] "GET /wp-includes/js/crop/cropper.php HTTP/1.1" 404 41912 "https://www.yahoo.com/" "Mozilla/5.0 (Linux; Android 12; 2201116SG) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36" 4.213.160.187 - - [31/Dec/2025:15:40:48 +0800] "GET /wp-includes/js/dist/ HTTP/1.1" 404 41912 "https://www.google.fr/" "Mozilla/5.0 (iPhone; CPU iPhone OS 17_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Mobile/15E148 Safari/604.1" 10.10.0.1 - - [31/Dec/2025:15:40:48 +0800] "GET / HTTP/1.1" 200 19946 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 SafeLine-CE/v9-2-8" |
21
FeranyDev 2 天前
@MagicCoder #20 好吧,我还说他默认给的不全来着。期待能出探针用于获取外部服务器的日志。
|
22
GetOctober 2 天前
ui 用的什么组件?挺好看的
|
23
dddddddddd 1 天前
期待开源
|
24
MagicCoder OP @GetOctober 手写的
|
25
MagicCoder OP @dddddddddd 嗯嗯 整理好了就开
|