当您的基础设施超过几台服务器后,通过SSH进行手动监控变得不切实际。Prometheus + Grafana是业界标准的开源监控和可视化解决方案。Prometheus充当时间序列数据库,从您的服务器和应用程序收集指标。Grafana是美观、交互式的前端,将原始指标转变为富有洞察力的仪表板。两者结合使用,能够实现实时监控、历史分析和智能告警——这些都是运行可靠系统的关键。
为什么选择Prometheus + Grafana?
传统方法是通过SSH登录每台服务器,然后运行 top、df 和 free -h 来获取系统信息。这种方法不具可扩展性。Prometheus和Grafana一次性解决了多个问题:
- 集中式监控 — 从单个仪表板查看10台、100台或1000台服务器的状态,无需逐一SSH登录
- 历史数据存储 — Prometheus长期存储指标数据,使您能够分析数周或数月的性能趋势
- 自动告警 — 定义规则,当CPU超过80%或磁盘使用率超过90%时,自动向Slack、PagerDuty或Email发送通知
- 开源且免费 — Prometheus和Grafana社区版没有许可证费用
- 灵活的查询语言 — PromQL使复杂的指标分析和自定义计算成为可能
- 庞大的生态系统 — 超过1000个导出器用于数据库、消息队列、Web服务器等
系统要求
- Ubuntu 20.04 LTS或更新版本的VPS(最低512MB RAM;建议2GB)
- 防火墙中开放端口9090(Prometheus)和3000(Grafana)
- 具有sudo权限以安装服务
- 可选:用于通过HTTPS访问Grafana的域名或子域名
第一步 — 安装Prometheus
创建prometheus用户和目录
sudo useradd --no-create-home --shell /bin/false prometheus
sudo mkdir -p /etc/prometheus /var/lib/prometheus
sudo chown prometheus:prometheus /etc/prometheus /var/lib/prometheus
下载并提取Prometheus
cd /tmp
wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz
tar -xvf prometheus-2.45.0.linux-amd64.tar.gz
# 复制二进制文件到系统路径
sudo cp prometheus-2.45.0.linux-amd64/prometheus /usr/local/bin/
sudo cp prometheus-2.45.0.linux-amd64/promtool /usr/local/bin/
sudo chown prometheus:prometheus /usr/local/bin/prometheus /usr/local/bin/promtool
# 复制控制台文件
sudo cp -r prometheus-2.45.0.linux-amd64/consoles /etc/prometheus
sudo cp -r prometheus-2.45.0.linux-amd64/console_libraries /etc/prometheus
sudo chown -R prometheus:prometheus /etc/prometheus
创建Prometheus配置文件
sudo tee /etc/prometheus/prometheus.yml > /dev/null << 'EOF'
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets: []
rule_files:
- '/etc/prometheus/alert.rules.yml'
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']
- job_name: 'remote-vps-1'
static_configs:
- targets: ['192.168.1.100:9100']
- job_name: 'remote-vps-2'
static_configs:
- targets: ['192.168.1.101:9100']
EOF
sudo chown prometheus:prometheus /etc/prometheus/prometheus.yml
为Prometheus创建systemd服务
sudo tee /etc/systemd/system/prometheus.service > /dev/null << 'EOF'
[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
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl start prometheus
sudo systemctl enable prometheus
验证Prometheus是否正在运行
curl -s http://localhost:9090
# 应返回HTML响应
# 在浏览器访问 http://YOUR_VPS_IP:9090
注意:Prometheus可以监控自身,但要监控其他服务器,您必须在每台目标服务器上安装Node Exporter。
第二步 — 安装Node Exporter(在每台被监控的服务器上)
cd /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
tar -xvf node_exporter-1.6.1.linux-amd64.tar.gz
sudo cp node_exporter-1.6.1.linux-amd64/node_exporter /usr/local/bin/
sudo chown root:root /usr/local/bin/node_exporter
# 创建systemd服务
sudo tee /etc/systemd/system/node_exporter.service > /dev/null << 'EOF'
[Unit]
Description=Node Exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/node_exporter
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter
验证Node Exporter
curl -s http://localhost:9100/metrics | head -20
# 应显示metrics,如node_cpu_seconds_total、node_memory_MemTotal_bytes等
第三步 — 安装Grafana
添加Grafana仓库并安装
sudo apt-get install -y software-properties-common
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
sudo apt-get update
sudo apt-get install -y grafana
启动Grafana服务
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
sudo systemctl status grafana-server
访问Grafana仪表板
# 在浏览器打开 http://YOUR_VPS_IP:3000
# 默认凭证:
# 用户名: admin
# 密码: admin
# 首次登录时更改密码
第四步 — 添加Prometheus作为数据源
- 在Grafana中:配置(齿轮图标)→ 数据源
- 点击"添加数据源"
- 选择"Prometheus"
- 将URL设置为:
http://localhost:9090 - 点击"保存并测试" → 应显示"Data source is working"
第五步 — 创建您的第一个仪表板
选项A:从头创建
转到 仪表板 → 创建 → 仪表板 → 添加面板(包含PromQL查询)
选项B:导入预构建的仪表板(推荐新手)
# 在Grafana中:+ (加号) → 导入
# 输入仪表板ID:1860(Node Exporter Full)
# 选择Prometheus数据源
# 点击导入
# 现在您拥有一个完整的仪表板,显示CPU、内存、磁盘、网络指标
第六步 — 设置告警规则
创建告警规则文件
sudo tee /etc/prometheus/alert.rules.yml > /dev/null << 'EOF'
groups:
- name: System Alerts
interval: 30s
rules:
- alert: HighCPUUsage
expr: (100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "{{ $labels.instance }} CPU使用率过高"
description: "{{ $labels.instance }} CPU使用率为 {{ $value }}%"
- alert: HighMemoryUsage
expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 85
for: 5m
labels:
severity: warning
annotations:
summary: "{{ $labels.instance }} 内存使用率过高"
- alert: HighDiskUsage
expr: (1 - (node_filesystem_avail_bytes{fstype!~"tmpfs"} / node_filesystem_size_bytes)) * 100 > 90
for: 5m
labels:
severity: critical
annotations:
summary: "{{ $labels.instance }} 磁盘使用率为 {{ $value | humanize }}%"
EOF
sudo chown prometheus:prometheus /etc/prometheus/alert.rules.yml
重新加载Prometheus
sudo systemctl reload prometheus
# 验证告警:http://YOUR_VPS_IP:9090/alerts
故障排查常见问题
Prometheus无法连接到Node Exporter
# 检查Prometheus日志
sudo journalctl -u prometheus -n 50
# 如果是远程服务器,允许防火墙
sudo ufw allow 9100/tcp
# 验证配置文件语法
sudo -u prometheus /usr/local/bin/promtool check config /etc/prometheus/prometheus.yml
Grafana显示"无数据"
# 验证时间范围是否足够大(默认:最后6小时)
# 检查面板查询中的PromQL语法
# 确认Prometheus有数据:curl http://localhost:9090/api/v1/targets
告警不工作
# 验证告警规则语法
sudo -u prometheus /usr/local/bin/promtool check rules /etc/prometheus/alert.rules.yml
# 在Prometheus UI中测试表达式
# 访问 http://YOUR_VPS_IP:9090/graph
# 尝试查询:avg(rate(node_cpu_seconds_total{mode=\"user\"}[5m]))
下一步:配置Alertmanager
上面的告警规则在Prometheus中本地触发,但不会发送通知。要将告警发送到Slack、Email或PagerDuty,您需要Alertmanager——一个处理告警路由和通知的配套组件。这是一个更高级的主题,但上述的Prometheus + Grafana + Node Exporter已为大多数用例提供了坚实的监控基础。
需要用于运行Prometheus + Grafana的VPS吗?
AsiaGB提供功能强大的Linux VPS,具有完整的root访问权限和SSD存储,非常适合运行监控基础设施。每月仅需500泰铢起,提供99%正常运行时间保证。
查看VPS套餐