VPS 资源监控可视化仪表板搭建
对于运行着多个应用的搬瓦工 VPS 来说,一个集中化的资源监控仪表板是必不可少的运维工具。本文将整合 Prometheus、Node Exporter 和 Grafana,搭建一个涵盖 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% 的循环折扣。