VPS

使用 Prometheus 和 Grafana 搭建 VPS 监控系统

更新:2026年10月2日  ·  阅读约 12 分钟
Grafana 仪表盘展示 VPS CPU 内存磁盘监控指标

为什么要监控 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 架构说明

安装前先了解各组件的角色:

基本架构:目标 VPS(Node Exporter:9100)→ Prometheus:9090 → Grafana:3000 — 本文所有组件部署在同一台 VPS 上,适合 2 GB+ 内存的机器。

安装 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 数据源:

  1. 在 Grafana UI → Connections → Data sources → Add data source → 选择 Prometheus
  2. URL 填写 http://localhost:9090 → Save & test → 应显示"Data source is working"
  3. 导入现成面板 → Dashboards → Import → 输入 ID 1860 → Load → 选择 Prometheus 数据源 → Import
Dashboard ID 1860 是 Grafana.com 上下载量最高的"Node Exporter Full"面板,导入后立即显示 CPU、内存、磁盘、网络的完整图表,无需手动编写任何查询语句。
Dashboard 1860 中的面板展示内容
CPU Basic用户态、内核态、I/O 等待、空闲百分比
Memory Basic总量、已用、空闲、缓存/缓冲
Disk Space Used %各分区使用率百分比
Network Traffic每秒接收/发送字节数
System Load1分钟、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 隧道访问 Prometheus,而非直接开放端口: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 = 您的强密码

总结

至此,您已成功搭建完整的自托管监控系统。本文完成的配置包括:

有了这套监控系统,您可以基于真实数据做出科学的扩容决策,不再凭感觉升级配置。如果需要一台性能足够同时运行监控系统和主应用的 VPS,欢迎查看 AsiaGB VPS 套餐。

需要适合监控系统的 VPS?

AsiaGB VPS 配备 SSD 存储、99% 可用性承诺,支持 Ubuntu 20.04/22.04/24.04,几分钟即可部署完成。

查看 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 磁盘空间,具体取决于监控的指标数量。