单服务器生产部署:从架构到故障恢复 · 8/10

服务器监控先看什么:CPU、内存、磁盘、日志与告警阈值

从用户可用性出发建立小型服务器监控:检查域名与 HTTPS、应用健康、CPU、内存、磁盘、备份年龄和日志异常,并用持续时间减少误报。

先监控用户能否访问,再监控机器数字

CPU 20%、内存 60% 看起来正常,域名解析错误或证书过期仍会让网站完全不可用。监控应从外到内分层:外部 HTTPS 请求、反向代理、应用健康、依赖、系统资源、备份。每一层都要有负责人和处理动作,否则只是把图表收藏起来。 对单服务器而言,少量高信号指标比几十张仪表板更实用。先建立能在夜里把真正故障告诉你的最小集合。

第一层:从服务器外部请求真实域名

每分钟或五分钟从另一网络请求 https://www.example.com/health,检查 DNS、TCP、TLS、状态码和响应时间。只在服务器本机 curl 会漏掉公网路由、证书和防火墙问题。 健康页面应轻量,不泄露版本、数据库地址或密钥。可以区分 liveness 与 readiness:前者说明进程活着,后者说明已经准备接收请求。公开监控还要检查证书剩余天数和域名到期提醒。

第二层:进程、容器和依赖

systemd 服务检查 active 状态、重启次数和最近失败;Compose 检查容器状态与 health。数据库监控连接是否成功、容量是否接近限制、慢查询是否突然增加。不要只监控 PID 存在,必须请求实际功能。

bash
systemctl is-active myapp caddy
systemctl show myapp -p NRestarts
docker compose ps
journalctl -u myapp --since '15 minutes ago' --no-pager

手工命令适合排查,持续监控可由现有监控系统采集。无论使用哪种工具,都保留一条不依赖被监控服务器本身的外部告警路径。

第三层:CPU、内存、磁盘和负载

CPU 短时 100% 可能只是构建或压缩,持续高占用并伴随响应变慢才值得告警。内存要同时看 available、Swap 活动和 OOM 记录,不要只看 used,因为 Linux 会利用空闲内存做缓存。负载值要结合 CPU 核数和 I/O 等待解释。 磁盘往往比 CPU 更紧急。根分区达到 85% 后先找增长来源,日志、容器层、备份和上传分别处理;不要写一个自动 rm -rf 清理未知目录。还要监控 inode,很多小文件也能让磁盘无法继续写入。

备份年龄是必须告警的业务指标

监控最近成功备份时间、体积与校验结果。今天的文件只有昨天一半,任务即使退出码为 0 也可能异常。异地上传失败、本地备份不断增长、恢复演练过期都应进入检查清单。 以 RPO 决定阈值:每天备份的网站,超过 26 或 30 小时没有成功副本就应提醒;不要等一周后才发现定时任务早已失效。

日志告警看模式,不转发全部文本

关注短时间 5xx 激增、登录失败异常、数据库连接耗尽、OOM、磁盘只读和服务反复重启。单个偶发 404 不值得半夜叫醒人。告警内容带上时间、主机、服务、最近变更和排查入口,但过滤密码、Cookie 与请求正文。 阈值同时包含数值与持续时间,例如磁盘使用超过 85% 持续 10 分钟。设置 warning 和 critical 两级,并设计恢复通知,避免问题已经结束却无人知道。

每个告警必须有第一步动作

“CPU 高”不够,告警附上查看进程、最近发布和流量的步骤;“网站不可用”先从外部重试,再看 DNS/TLS/Caddy/上游。每月回顾误报、漏报和无人处理的告警,删除无法行动的噪声。 完成标准是:公网故障、服务退出、磁盘逼近上限、备份过期和 5xx 异常都能在用户投诉前被发现,且接收者知道第一步做什么。下一篇把这些信号放进 502、504 与 HTTPS 分层排错

参考来源

  1. journalctlsystemd
我正在使用 · 推广推荐

准备上线时,可以再比较这两项服务

这不是自动排名,也不是每个人都需要购买。我只列出自己正在使用的入口,并把适用场景和限制说清楚。

云服务器 · 前期项目在用

雨云 RainYun

准备部署网站或小型服务时,可以把它作为入门候选;先按用户地区、配置和真实负载判断,不要只看最低价格。

推广说明:链接包含我的推荐信息。你通过链接注册或开通后,我可能获得平台奖励;不会因此向你额外收费。价格、活动、地区与服务条款请以下单页为准。 查看完整商业披露