个人网站监控

我的个人网站已经运行好几年了,由于没什么收益、访问量也不多,一直没接入监控,长期处于放养状态。

由于同主域名下,有微信小程序的后端 api,每次我想看看有哪些人使用了我的小程序,该死的“We 分析”小程序想看明白是真的很费劲,其中“实时数据”为专业版专属,按量收费的。

这很腾讯,表示理解尊重,本来用户数据就惨淡,¥30/y 的认证费都收不回来,更不可能付费开通开实时数据。

不想被小马哥 Pony Ma 吸血的话,只能自给自足丰衣足食。话说陕北南泥湾那个地方我去游玩过,条件真的很艰苦!

优势在人不在我,需求如下:

  • 每天多少个人在用
  • 访问延时如何
  • 状态码分布,有没有 4xx、5xx 错误
  • 哪些地区的人在访问

弄清楚这些基本状况就差不多了,能及时发现问题,并做针对性优化。

个人网站跑在 Caddy 上面,所以监控 Caddy 本身和日志就 ok 了。其它 webserver 如 Nginx 等原理差不多,类似工具也有的。

1. Caddy 监控

Caddy 是可以配置直接给 Prometheus 吐 metircs 数据的,modules/metrics/metrics.gomodules/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_successfulcaddy_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 帮你写,时代变了😅。

有需要的中文读者,也可以通过微信公众号留言索取。

截图示例如下:

caddy_monitor_1
caddy_monitor_2

效果还是非常不错的,该有的都有了,状态码、延时分布等清清楚楚。只是树莓派的配置不怎么好,我只存 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 错误,世界真奇妙,光速修复之。

caddy_404_fix

原因是该文章的在翻译为西班牙语的时候,图片链接地址被翻译错位了,wofi-menu 翻成了 menu-wofi,尽管站内西班牙语页面,目前有且仅有 3 个, 但真的有读者。

之前我不太相信 Google Analytics 的数据,网站用户分布图各种诡异离奇,现在我信了,那篇文章 Google 搜索排名前 10,真的有用🤷‍♂️。

这辈子恐怕没什么机会去危地马拉,能服务陌生 Linux 用户,甚是欣慰。

要知道手敲一篇文章,整个流程下来大约消耗 2 个小时,没有任何报酬,在中国 Google Adsense 搞不到钱💰,纯粹的单向服务,用爱发电。

其实,还能发现各种网络攻击日志,后续再写文章介绍。

最后修改于: Wednesday, January 21, 2026
欢迎关注微信公众号,留言交流;也欢迎使用我开发的微信小程序。

相关文章:

翻译: