
目录
为什么要监控 VPS
当网站或应用突然变慢甚至崩溃时,第一个问题往往是:"发生了什么?" 如果没有监控系统,你只能在事后 SSH 登录,手动运行 top 或 df -h,既慢又无法查看历史趋势。
Prometheus + Grafana 是目前生产环境中最广泛使用的自托管监控方案。部署在 VPS 上完全免费,监控深度远超昂贵的 SaaS 工具。
| 监控指标 | 采集工具 | 价值 |
|---|---|---|
| CPU 使用率 | Node Exporter → Prometheus | 在用户感知之前发现性能问题 |
| 内存使用/剩余 | Node Exporter → Prometheus | 基于真实数据规划升级计划 |
| 磁盘 I/O 与使用率 | Node Exporter → Prometheus | 防止磁盘满导致数据库损坏 |
| 网络流量 | Node Exporter → Prometheus | 检测异常流量或早期 DDoS 迹象 |
| 自定义应用指标 | 客户端库 → Prometheus | 追踪请求速率和错误率 |
Prometheus + Grafana 架构说明
安装前先了解各组件的角色:
- Node Exporter — 运行在被监控 VPS 上,通过 9100 端口的 HTTP 接口暴露操作系统指标
- Prometheus — 每 15 秒从 Node Exporter 抓取一次数据,存入内置的时序数据库
- Grafana — 以 Prometheus 为数据源,将指标渲染为交互式图表和仪表盘
- Alertmanager(可选)— 接收 Prometheus 的告警并路由到邮件、Slack 或 Webhook
安装 Prometheus
在 Ubuntu 22.04 上下载并安装 Prometheus:
# 创建专用系统用户
sudo useradd --no-create-home --shell /bin/false prometheus
# 创建目录
sudo mkdir /etc/prometheus /var/lib/prometheus
# 下载 Prometheus(在 github.com/prometheus/prometheus 查看最新版本)
PROM_VER="2.53.0"
wget https://github.com/prometheus/prometheus/releases/download/v${PROM_VER}/prometheus-${PROM_VER}.linux-amd64.tar.gz
tar -xzf prometheus-${PROM_VER}.linux-amd64.tar.gz
cd prometheus-${PROM_VER}.linux-amd64/
# 复制二进制文件
sudo cp prometheus /usr/local/bin/
sudo cp promtool /usr/local/bin/
sudo chown prometheus:prometheus /usr/local/bin/prometheus /usr/local/bin/promtool
# 复制配置文件
sudo cp -r consoles/ /etc/prometheus/
sudo cp -r console_libraries/ /etc/prometheus/
sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus
创建初始配置文件
sudo nano /etc/prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']
创建 systemd 服务
sudo nano /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
--config.file /etc/prometheus/prometheus.yml \
--storage.tsdb.path /var/lib/prometheus/ \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries \
--storage.tsdb.retention.time=30d
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable prometheus
sudo systemctl start prometheus
sudo systemctl status prometheus
安装 Node Exporter
Node Exporter 负责采集操作系统级别的指标——CPU、内存、磁盘、网络:
NODE_VER="1.8.1"
wget https://github.com/prometheus/node_exporter/releases/download/v${NODE_VER}/node_exporter-${NODE_VER}.linux-amd64.tar.gz
tar -xzf node_exporter-${NODE_VER}.linux-amd64.tar.gz
sudo cp node_exporter-${NODE_VER}.linux-amd64/node_exporter /usr/local/bin/
sudo useradd --no-create-home --shell /bin/false node_exporter
sudo nano /etc/systemd/system/node_exporter.service
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable node_exporter
sudo systemctl start node_exporter
验证 Node Exporter 正常运行:curl http://localhost:9100/metrics | head -20
配置 Prometheus 数据采集
上面的 prometheus.yml 已经配置了 localhost:9100 作为采集目标。通过 Prometheus UI 验证采集状态:
http://您的VPS_IP:9090 → Status → Targets → node 目标应显示为 UP
在 Prometheus UI 的 Expression 输入框中尝试以下查询:
# CPU 使用率 (%)
100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# 已用内存 (字节)
node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes
# 磁盘使用率 (%)
(node_filesystem_size_bytes - node_filesystem_free_bytes) / node_filesystem_size_bytes * 100
安装 Grafana
通过官方 apt 仓库安装 Grafana:
sudo apt-get install -y apt-transport-https software-properties-common wget
wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /usr/share/keyrings/grafana.gpg > /dev/null
echo "deb [signed-by=/usr/share/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee /etc/apt/sources.list.d/grafana.list
sudo apt-get update
sudo apt-get install -y grafana
sudo systemctl daemon-reload
sudo systemctl enable grafana-server
sudo systemctl start grafana-server
浏览器访问 http://您的VPS_IP:3000 → 使用 admin / admin 登录 → 系统会立即提示修改密码。
创建第一个监控面板
将 Prometheus 配置为 Grafana 数据源:
- 在 Grafana UI → Connections → Data sources → Add data source → 选择 Prometheus
- URL 填写
http://localhost:9090→ Save & test → 应显示"Data source is working" - 导入现成面板 → Dashboards → Import → 输入 ID 1860 → Load → 选择 Prometheus 数据源 → Import
| Dashboard 1860 中的面板 | 展示内容 |
|---|---|
| CPU Basic | 用户态、内核态、I/O 等待、空闲百分比 |
| Memory Basic | 总量、已用、空闲、缓存/缓冲 |
| Disk Space Used % | 各分区使用率百分比 |
| Network Traffic | 每秒接收/发送字节数 |
| System Load | 1分钟、5分钟、15分钟平均负载 |
| Disk I/O | 每秒读写字节数 |
配置 CPU/内存告警
在 Prometheus 中添加告警规则,当指标超过阈值时触发通知:
sudo nano /etc/prometheus/alert.rules.yml
groups:
- name: node_alerts
rules:
- alert: HighCPU
expr: 100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
for: 5m
labels:
severity: warning
annotations:
summary: "CPU 使用率过高 {{ $value }}%"
description: "实例 {{ $labels.instance }} CPU 使用率超过 85% 已持续 5 分钟"
- alert: LowMemory
expr: (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 < 15
for: 5m
labels:
severity: critical
annotations:
summary: "可用内存不足 {{ $value }}%"
description: "实例 {{ $labels.instance }} 可用内存低于 15%"
- alert: DiskAlmostFull
expr: (node_filesystem_size_bytes - node_filesystem_free_bytes) / node_filesystem_size_bytes * 100 > 85
for: 10m
labels:
severity: warning
annotations:
summary: "磁盘使用率 {{ $value }}%"
description: "实例 {{ $labels.instance }} 的 {{ $labels.mountpoint }} 磁盘使用率已达 {{ $value }}%"
将规则文件添加到 prometheus.yml:
rule_files:
- "/etc/prometheus/alert.rules.yml"
sudo systemctl reload prometheus
安全加固 — 防火墙与认证
默认情况下,Prometheus(9090)和 Node Exporter(9100)对所有 IP 开放。需要通过防火墙限制访问:
# 禁止外部访问 Prometheus 和 Node Exporter
sudo ufw deny 9090
sudo ufw deny 9100
# 或仅允许特定 IP 访问
sudo ufw allow from 您的办公室IP to any port 9090
ssh -L 9090:localhost:9090 user@您的VPS_IP,然后在本地浏览器访问 http://localhost:9090,安全性更高。
Grafana 认证配置
sudo nano /etc/grafana/grafana.ini
[auth.anonymous]
enabled = false
[security]
admin_password = 您的强密码
总结
至此,您已成功搭建完整的自托管监控系统。本文完成的配置包括:
- 安装 Prometheus 作为时序数据库,每 15 秒自动采集一次数据
- 安装 Node Exporter,通过 9100 端口暴露 CPU、内存、磁盘、网络指标
- 将 Grafana 连接至 Prometheus,并导入 Dashboard 1860 即可使用
- 配置 CPU >85%、内存 <15%、磁盘 >85% 的告警规则
- 通过防火墙规则阻止外部直接访问 Prometheus 和 Node Exporter
有了这套监控系统,您可以基于真实数据做出科学的扩容决策,不再凭感觉升级配置。如果需要一台性能足够同时运行监控系统和主应用的 VPS,欢迎查看 AsiaGB VPS 套餐。
常见问题
Prometheus 和 Grafana 有什么区别?
Prometheus 是时序数据库,负责采集和存储指标数据;Grafana 是可视化平台,从 Prometheus 读取数据并以图表形式展示。两者分工明确,协同工作。
Node Exporter 是什么?
Node Exporter 是运行在 Linux 服务器上的轻量级代理,通过 9100 端口暴露操作系统指标(CPU、内存、磁盘、网络),供 Prometheus 定期抓取,无需修改任何系统配置。
这套监控方案需要多少内存?
三个组件合计约占用 400-600 MB 内存。建议 VPS 至少配备 2 GB 内存,确保监控系统与主业务都能流畅运行。
可以将告警发送到企业微信或钉钉吗?
可以 — Alertmanager 支持 Webhook,可以通过企业微信机器人、钉钉机器人或自定义脚本接收告警。Grafana 告警也支持多种国内通知渠道。
Dashboard ID 1860 可以直接使用吗?
是的 — 只需通过 ID 从 Grafana 导入,选择 Prometheus 数据源,即可立即获得包含 CPU、内存、磁盘和网络的完整监控面板,无需手动配置任何查询。
Prometheus 可以保留多长时间的数据?
默认保留 15 天。通过 --storage.tsdb.retention.time=30d 参数可延长至 30 天。保留 30 天的数据通常占用 2-5 GB 磁盘空间,具体取决于监控的指标数量。