服务器监控教程:用Prometheus+Grafana搭建可视化告警系统
服务器监控的核心目标是:在CPU跑满、内存泄漏或磁盘写满之前收到通知,而不是等网站打不开才去查。
本文用Prometheus采集数据、Grafana展示图表、node_exporter监控Linux主机,全部通过Docker部署,适合刚接触运维的新手照做。
这套方案适合什么场景
如果你只有一两台云服务器,不想装商业监控Agent,又希望看到历史趋势和阈值告警,Prometheus+Grafana是常见选择。
它不依赖外部服务,数据存在本地,缺点是数据默认保留15天,长期存储需要额外配置。
需要准备:
一台Linux服务器(Ubuntu 20.04/Debian 11/CentOS 7以上均可),
已安装Docker和Docker Compose,
服务器能访问外网拉取镜像。
第一步:确认Docker环境
先检查Docker是否可用:
docker --version
docker compose version
如果提示command not found,先安装Docker。
以Ubuntu为例:
apt update && apt install -y docker.io docker-compose-plugin
systemctl enable --now docker
验证方式:执行docker ps能正常输出表头即表示Docker服务已运行。
第二步:编写监控服务的compose文件
新建目录并进入:
mkdir -p /opt/monitor && cd /opt/monitor
创建docker-compose.yml,内容如下:
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- ./rules:/etc/prometheus/rules
- prom_data:/prometheus
restart: unless-stopped
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
ports:
- "9100:9100"
restart: unless-stopped
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
restart: unless-stopped
volumes:
prom_data:
grafana_data:
注意:node-exporter默认暴露9100端口,如果服务器有公网IP,建议后面用防火墙限制来源,不要直接对全网开放。
第三步:配置Prometheus采集目标
在同级目录创建prometheus.yml:
global:
scrape_interval: 15s
rule_files:
- /etc/prometheus/rules/*.yml
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['node-exporter:9100']
这里用容器名node-exporter作为地址,因为Compose默认创建了同一网络,容器之间可以通过服务名互相访问。
如果你要监控多台远程服务器,把targets改成['IP:9100'],并在每台被监控机上单独部署node-exporter。
验证方式:启动服务后访问http://服务器IP:9090/targets,看到node这个job的状态是UP,说明采集正常。
第四步:启动并检查服务状态
docker compose up -d
docker compose ps
三个容器都应该是running状态。
如果某个容器反复重启,用以下命令看日志:
docker logs prometheus --tail 50
docker logs grafana --tail 50
常见报错Error loading config多数是prometheus.yml缩进写错。
YAML对空格敏感,不要用Tab缩进,冒号后面要留一个空格。
第五步:在Grafana接入数据源并导入面板
浏览器打开http://服务器IP:3000,默认账号密码都是admin,首次登录会要求改密码。
操作路径:
左侧菜单 → Connections → Data sources → Add data source → 选择Prometheus → URL填http: → 点击Save & test,
//prometheus:
9090
出现绿色提示即成功。
接着导入现成的仪表盘:
左侧菜单 → Dashboards → Import → 在输入框填入1860(Node Exporter Full的常用编号)→ Load → 选择Prometheus数据源 → Import。
预期结果:页面出现CPU、内存、磁盘、网络等图表,数据每隔15秒刷新一次。
如果图表显示No data,先回到Prometheus的targets页面确认采集状态。
第六步:配置一条磁盘告警规则
在/opt/monitor下创建rules目录和规则文件:
mkdir -p rules
新建rules/disk.yml:
groups:
- name: disk-alert
rules:
- alert: DiskWillFillIn4Hours
expr: predict_linear(node_filesystem_avail_bytes{mountpoint="/"}[1h], 4 * 3600) < 0
for: 10m
labels:
severity: warning
annotations:
summary: "根分区预计4小时内写满"
这条规则用predict_linear根据过去1小时的趋势预测4小时后剩余空间,比单纯判断“使用率大于90%”更早发现异常。
修改后重载Prometheus配置:
curl -X POST http://localhost:9090/-/reload
如果提示方法不允许,说明启动参数没开启热加载,直接docker compose restart prometheus即可。
验证方式:访问http://服务器IP:9090/alerts,能看到DiskWillFillIn4Hours处于inactive状态,说明规则已加载。
容易踩的几个坑
- 端口没放行:云服务器安全组要放行9090、3000、9100,否则浏览器打不开。
- node-exporter只监控自己:它默认只采集本机数据,监控远程主机必须在目标机上部署。
- Grafana数据源填错地址:容器内要用服务名
prometheus,不要填localhost,因为localhost指向Grafana容器自身。 - 告警没有通知渠道:Prometheus自身只负责触发告警,要发邮件或钉钉需要额外部署Alertmanager,本文未展开。
- 数据盘占满:Prometheus默认保留15天,数据量大时定期检查
prom_data卷占用。
怎么确认监控真的在跑
三个检查点:Prometheus的/targets页面状态为UP;
Grafana面板有随时间变化的曲线;/alerts页面能看到规则列表。
满足这三点,说明采集、展示、告警三条链路都已打通。
后续可根据需要增加MySQL、Nginx等exporter,采集方式与node-exporter一致。
如果你正在搭建服务器监控,建议先按本文把单机跑通,再逐步扩展到多台主机和通知渠道,避免一次性配置过多导致排错困难。