个人网站监控
我的个人网站已经运行好几年了,由于没什么收益、访问量也不多,一直没接入监控,长期处于放养状态。
由于同主域名下,有微信小程序的后端 api,每次我想看看有哪些人使用了我的小程序,该死的“We 分析”小程序想看明白是真的很费劲,其中“实时数据”为专业版专属,按量收费的。
这很腾讯,表示理解尊重,本来用户数据就惨淡,¥30/y 的认证费都收不回来,更不可能付费开通开实时数据。
不想被小马哥 Pony Ma 吸血的话,只能自给自足丰衣足食。话说陕北南泥湾那个地方我去游玩过,条件真的很艰苦!
优势在人不在我,需求如下:
- 每天多少个人在用
- 访问延时如何
- 状态码分布,有没有 4xx、5xx 错误
- 哪些地区的人在访问
弄清楚这些基本状况就差不多了,能及时发现问题,并做针对性优化。
个人网站跑在 Caddy 上面,所以监控 Caddy 本身和日志就 ok 了。其它 webserver 如 Nginx 等原理差不多,类似工具也有的。
1. Caddy 监控
Caddy 是可以配置直接给 Prometheus 吐 metircs 数据的,modules/metrics/metrics.go 和 modules/caddyhttp/metrics.go
源码文件中有相关实现逻辑。
开启监控
在 Caddyfile 中开启监控:
1{
2 metrics {
3 per_host
4 }
5}
per_host 表示开启按 Host 区分,即相关指标有个 host 标签,用来区分不同域名的流量,有个多个域名的话建议开启。
另外还建议分独立域名来查看监控信息,少暴露 2019 端口,监控数据直接通过域名查看。
1monitor.xxx.com {
2 metrics
3 #@blocked not remote_ip input_your_public_ip
4 #respond @blocked "Forbidden: Access denied👻" 403
5
6 basic_auth {
7 your_username your_hash_password # 加密后的密码(通过 caddy hash-password 生成)
8 }
9}
basic_auth 能一定程度上保证安全,用户和密码部分 Prometheus 会用到,有固定 ip 也可以加上 ip 白名单(看注释部分),你觉得怎么安全放心就怎么做。
Caddy 监控指标分 4 个大类:
- Runtime metrics (运行时指标,指标名以
go_*和process_*开头,监控 caddy 进程本身) - Admin API metrics (监控 admin api, 指标名以
caddy_admin_*开头) - HTTP Middleware metrics (关键部分,HTTP 相关,比如请求延时、TTFB、errors、请求和返回的 body 大小等,指标名以
caddy_http_*开头) - Reverse proxy metrics (后端代理的监控,比如我有个 Rust 写的 api 给微信小程序用的,Caddy 能简单监控该后端服务是否存活,目前就一个指标
caddy_reverse_proxy_upstreams_healthy)
其实搜索 Prometheus 中的收集的指标,还有 caddy_config_last_reload_successful 和 caddy_config_last_reload_success_timestamp_seconds 两个,看源码是属于 globalMetrics,官方文档里面没有写,看字面意思就很好理解,不解释。
2. Prometheus 配置
Prometheus 跑在家里的树莓派上面,物尽其用,功耗很低。读者看自己情况部署,方便访问同时保证安全就好。
直接看配置
1global:
2 scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
3 evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
4 external_labels:
5 monitor: "example"
6
7# Alertmanager configuration
8alerting:
9 alertmanagers:
10 - static_configs:
11 - targets: ["localhost:9093"]
12
13rule_files:
14 # - "first_rules.yml"
15 # - "second_rules.yml"
16
17scrape_configs:
18 - job_name: caddy
19 scrape_interval: 10s
20 scrape_timeout: 8s
21 scheme: https
22 basic_auth:
23 username: "your_usernmae"
24 password: "your_password"
25 static_configs:
26 - targets: ["monitor.xxx.com"]
3. Grafana 监控面板
监控面板分域名的话,可以选择 id:24146,没分域名选 id:22870
还不满意,可以自己在上面的基础上修改或者自己创建一个,前提是要稍微了解 Grafana 逻辑和 Prometheus 查询语言。
我在 22870 的基础上添加了域名信息,域名添加了特殊过滤,只关注特定的几个域名。过滤域名需要在 Grafana 配置正则表达式,不会的让 AI 帮你写,时代变了😅。
有需要的中文读者,也可以通过微信公众号留言索取。
截图示例如下:

效果还是非常不错的,该有的都有了,状态码、延时分布等清清楚楚。只是树莓派的配置不怎么好,我只存 15 天信息,选取 24h 小时信息会稍微卡一下,老型号性能差,个人网站监控绝对够用。
Grafana 我部署在自己的 mini 主机上面,在家有空偶尔看几下。
至于说告警通知,目前不想接入,工作告警已经够让人操心的了,网上有一大堆相关文章。
4. 日志监控
细心的读者可能早就有疑问了,上面没法知道哪些地区的人访问了什么网页啊?没错,日志监控来解决。
日志监控工具有好多,比如 轻量级的 GoAccess,中级的 openobserve,重量级 ELK 等,我选 nginxpulse,精神小伙开发的,作者很勤奋、更新很快,满足个人网站需求。
请看配置,做了脱敏处理,你应该能懂的,不懂看 https://github.com/likaia/nginxpulse 的文档部分。
1root@tokyo:~# systemctl cat nginxpulse.service
2# /etc/systemd/system/nginxpulse.service
3[Unit]
4Description=Nginxpulus Service
5After=network.target
6
7[Service]
8Type=simple
9User=root
10WorkingDirectory=/opt/caddylog
11ExecStart=/opt/caddylog/nginxpulse
12Restart=always
13RestartSec=5
14
15[Install]
16WantedBy=multi-user.target
17
18root@tokyo:~# cat /opt/caddylog/
19configs/ nginxpulse var/
20root@tokyo:~# cat /opt/caddylog/configs/nginxpulse_config.json
21{
22 "websites": [
23 {
24 "name": "yyy",
25 "logType": "caddy",
26 "logPath": "/var/log/caddy/yyy.log",
27 "domains": ["yyy.com"]
28 },
29 {
30 "name": "xxx",
31 "logType": "caddy",
32 "logPath": "/var/log/caddy/xxx.com.log",
33 "domains": ["xxx.com"]
34 }
35 ],
36 "system": {
37 "logDestination": "file",
38 "taskInterval": "1m",
39 "logRetentionDays": 30,
40 "demoMode": false,
41 "accessKeys": ["yourkey"],
42 "language": "zh-CN"
43 },
44 "server": {
45 "Port": "localhost:8088"
46 },
47 "pvFilter": {
48 "statusCodeInclude": [
49 200
50 ],
51 "excludePatterns": [
52 "favicon.ico$",
53 "robots.txt$",
54 "sitemap.xml$",
55 "^/health$",
56 "^/_(?:nuxt|next)/",
57 "rss.xml$",
58 "feed.xml$",
59 "atom.xml$"
60 ],
61 "excludeIPs": ["127.0.0.1", "::1", "10.10.0.1", "192.168.30.21"]
62 }
63}
采用单体部署方式,在电脑编译好 nginxpulse 二进制文件,传到服务器简单配置下就能运行了,还是很不错的。
效果可以看作者的示例网站: https://nginx-pulse.kaisir.cn/
5. 总结
通过 websever 层和日志层的监控,基本能覆盖轻量个人网站的需求,什么链路监控就不扯了,企业级别的业务才用考虑。
实用又简便,既能满足上面所列需求,也能发现问题,做出针对性优化。
比如通过日志监控,发现真的有危地马拉用户访问了我的网站,触发一个 404 错误,世界真奇妙,光速修复之。

原因是该文章的在翻译为西班牙语的时候,图片链接地址被翻译错位了,wofi-menu 翻成了 menu-wofi,尽管站内西班牙语页面,目前有且仅有 3 个, 但真的有读者。
之前我不太相信 Google Analytics 的数据,网站用户分布图各种诡异离奇,现在我信了,那篇文章 Google 搜索排名前 10,真的有用🤷♂️。
这辈子恐怕没什么机会去危地马拉,能服务陌生 Linux 用户,甚是欣慰。
要知道手敲一篇文章,整个流程下来大约消耗 2 个小时,没有任何报酬,在中国 Google Adsense 搞不到钱💰,纯粹的单向服务,用爱发电。
其实,还能发现各种网络攻击日志,后续再写文章介绍。

版权申明:
- 未标注来源的内容全部为原创,未经授权请勿转载(因转载后排版往往错乱、内容不可控、无法持续更新等);
- 非营利为目的,演绎本博客任何内容,请以'原文出处'或者'参考链接'等方式给出本站相关网页地址(方便读者)。
相关文章:
- Hysteria科学上网简要
- Caddy简单图片防盗链
- Caddy日志配置轮转和格式化
- Hugo全站AVIF记
- Linux下尝试使用Godot开发小游戏
- Arch linux dae 透明代理
- Airflow接管galler-dl下载任务
- 如何使用gallery-dl批量下载图像
- Arch核显下如何愉快玩Dota2和CS2
- Arch/labwc 环境网络相关设置