個人網站監控

我的個人網站已經運行好幾年了,由於沒什麼收益、訪問量也不多,一直沒接入監控,長期處於放養狀態。

由於同主域名下,有微信小程序的後端 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
欢迎关注微信公众号,留言交流;也欢迎使用我开发的微信小程序。

相關文章:

翻譯: