VPS 资源监控可视化仪表板搭建

对于运行着多个应用的搬瓦工 VPS 来说,一个集中化的资源监控仪表板是必不可少的运维工具。本文将整合 PrometheusNode ExporterGrafana,搭建一个涵盖 CPU、内存、磁盘、网络等核心指标的一站式 VPS 监控大屏。

一、架构设计

整体监控架构分为三层:

  • 数据采集层Node Exporter 采集系统指标,cAdvisor 采集容器指标。
  • 数据存储层Prometheus 拉取并存储时间序列数据。
  • 可视化层Grafana 展示仪表板和告警。

二、一键部署完整监控栈

mkdir -p /opt/vps-monitoring
cat > /opt/vps-monitoring/docker-compose.yml <<'EOF'
version: '3.8'

services:
  node-exporter:
    image: prom/node-exporter:latest
    container_name: node-exporter
    restart: unless-stopped
    network_mode: host
    pid: host
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - '--path.rootfs=/rootfs'
      - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'

  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: unless-stopped
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - ./alert_rules.yml:/etc/prometheus/alert_rules.yml
      - prometheus-data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.retention.time=90d'
      - '--web.enable-lifecycle'

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: unless-stopped
    ports:
      - "3000:3000"
    volumes:
      - grafana-data:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=your_secure_password
      - GF_USERS_ALLOW_SIGN_UP=false

volumes:
  prometheus-data:
  grafana-data:
EOF

Prometheus 配置

cat > /opt/vps-monitoring/prometheus.yml <<'EOF'
global:
  scrape_interval: 15s
  evaluation_interval: 15s

rule_files:
  - "alert_rules.yml"

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'node'
    static_configs:
      - targets: ['host.docker.internal:9100']
        labels:
          instance: 'bwg-vps'

  - job_name: 'node-local'
    static_configs:
      - targets: ['172.17.0.1:9100']
        labels:
          instance: 'bwg-vps'
EOF

告警规则

cat > /opt/vps-monitoring/alert_rules.yml <<'EOF'
groups:
  - name: vps_health
    rules:
      - alert: HighCpuUsage
        expr: 100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 10m
        labels:
          severity: warning
        annotations:
          summary: "CPU 使用率过高"

      - alert: HighMemoryUsage
        expr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "内存使用率过高"

      - alert: DiskSpaceLow
        expr: (1 - node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 > 85
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "磁盘空间不足"
EOF

cd /opt/vps-monitoring
docker compose up -d

三、仪表板设计

在 Grafana 中创建 VPS 监控仪表板,按以下结构组织面板:

3.1 概览行(Stat 面板)

顶部一行展示关键指标的当前值:

# 运行时长
time() - node_boot_time_seconds

# CPU 使用率
100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# 内存使用率
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100

# 磁盘使用率
(1 - node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100

# 网络入站流量
rate(node_network_receive_bytes_total{device="eth0"}[5m])

3.2 CPU 详情行

# CPU 使用率趋势(Time Series 面板)
100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# 系统负载(Time Series 面板)
node_load1
node_load5
node_load15

3.3 内存详情行

# 内存分布(Stacked Time Series)
node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes  # 已用
node_memory_Cached_bytes  # 缓存
node_memory_Buffers_bytes  # 缓冲
node_memory_MemAvailable_bytes - node_memory_Cached_bytes - node_memory_Buffers_bytes  # 可用

3.4 网络流量行

# 入站/出站带宽(Time Series 面板)
rate(node_network_receive_bytes_total{device="eth0"}[5m])
rate(node_network_transmit_bytes_total{device="eth0"}[5m])

3.5 磁盘详情行

# 磁盘使用情况(Gauge 面板)
(1 - node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100

# 磁盘 IO(Time Series 面板)
rate(node_disk_read_bytes_total[5m])
rate(node_disk_written_bytes_total[5m])

四、快速导入推荐仪表板

如果不想从零开始设计,可以直接导入社区仪表板:

  • 在 Grafana 中进入「Dashboards」→「Import」。
  • 输入仪表板 ID 1860(Node Exporter Full)。
  • 选择 Prometheus 数据源,点击「Import」。

导入后可以根据需求调整面板布局和查询。

五、搬瓦工流量监控

搬瓦工 VPS 有月流量限制,监控网络流量使用非常重要:

# 本月已用出站流量(GB)
increase(node_network_transmit_bytes_total{device="eth0"}[30d]) / 1073741824

# 每日平均出站流量
rate(node_network_transmit_bytes_total{device="eth0"}[24h]) * 86400 / 1073741824

# 预测本月出站流量
predict_linear(node_network_transmit_bytes_total{device="eth0"}[7d], 30*86400) / 1073741824

六、Nginx 反向代理配置

server {
    listen 443 ssl http2;
    server_name monitor.your-domain.com;

    ssl_certificate /etc/letsencrypt/live/monitor.your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/monitor.your-domain.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

七、安全配置

# 仅允许本机访问 Prometheus 和 Node Exporter
ufw allow from 127.0.0.1 to any port 9090
ufw allow from 127.0.0.1 to any port 9100
ufw deny 9090
ufw deny 9100

# Grafana 通过 Nginx 反向代理对外,开放 443
ufw allow 443/tcp

八、备份策略

# 备份 Grafana 仪表板和配置
docker exec grafana grafana-cli admin export-all-dashboards --directory=/tmp/backup
docker cp grafana:/tmp/backup ./grafana-backup-$(date +%Y%m%d)

# 备份 Prometheus 数据
docker exec prometheus promtool tsdb create-blocks-from openmetrics /prometheus/snapshots/ /tmp/backup

# 定期自动备份(crontab)
0 2 * * * cd /opt/vps-monitoring && tar czf /backup/monitoring-$(date +\%Y\%m\%d).tar.gz grafana-data prometheus-data

九、常见问题

Node Exporter 指标为空

Docker 部署的 Prometheus 可能无法通过 localhost 访问宿主机的 Node Exporter,需要使用宿主机的 Docker 网桥 IP(通常是 172.17.0.1)。

Grafana 图表无数据

先确认 Prometheus 能正常抓取数据(访问 http://localhost:9090/targets),然后检查 Grafana 数据源配置是否正确。

总结

一个好的监控仪表板能让你随时掌握 VPS 的运行状态,及时发现和处理问题。搬瓦工 VPS 的 KVM 架构完美支持这套监控方案。选购搬瓦工 VPS 请参考 全部方案,使用优惠码 NODESEEK2026 可享受 6.77% 的循环折扣。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。