大家好,这次的话又是给大家介绍一个非常专业的监控软件:Prometheus,本教程我们将搭配 Grafana 来为大家展示搭建的过程,并且以node_exporter来作为被控端的软件。

一、准备工作
1、前提条件
首先的话我们需要准备以下的工具:
- 一台用于搭建Prometheus + Grafana 的VPS服务器(配置建议1C1G以上)
- 若干台被监控的VPS(配置需求不大)
2、安装Docker
如果有条件的话,监控端的VPS安装上 Docker,这可以更方便为我们部署软件,方便收纳整理,一键安装命令(官方一键安装):
curl -fsSL https://get.docker.com | bash国内服务器安装:(轩辕镜像站)
bash <(wget -qO- https://xuanyuan.cloud/docker.sh)没用过轩辕镜像站,但是听描述说是这个命令安装后,镜像链接也帮忙配置好了。再给大家推荐一个镜像站,我比较常用的:毫秒镜像站
安装完之后如果想要进行更改默认镜像站的话,按以下命令操作即可:
mkdir -p /etc/docker # 新建配置文件夹
vim /etc/docker/daemon.json # 新建配置文件把以下内容复制进去,保存即可:
{
"registry-mirrors": [
"https://docker.1ms.run"
]
}重启Docker:
systemctl daemon-reexec
sudo systemctl restart docker确保Docker能够正常运行:
docker info
二、开始搭建监控端
1、通过 Docker Compose 一键部署
①配置 Docker-compose.yml
这次搭建的方式十分简单,我们直接用 Docker Compose 搭建即可,我们先创建一个文件夹用于存放 docker-compose.yml:
mkdir -p /home/docker/prometheus # 自己选择一个创建文件夹的地方
cd /home/docker/prometheus # 进入目标文件夹
vim docker-compose.yml # 创建docker-compose.yml在 docker-compose.yml 中放下以下内容:
version: "3.8"
volumes:
prometheus_data: {}
grafana_data: {}
networks:
proxy:
monitoring:
services:
watchtower:
image: containrrr/watchtower:latest
environment:
- WATCHTOWER_LABEL_ENABLE=true
volumes:
- /var/run/docker.sock:/var/run/docker.sock
labels:
com.centurylinklabs.watchtower.enable: "true"
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
restart: unless-stopped
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- "--path.procfs=/host/proc"
- "--path.rootfs=/rootfs"
- "--path.sysfs=/host/sys"
- "--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)"
ports:
- "9100:9100"
networks:
- monitoring
labels:
com.centurylinklabs.watchtower.enable: "true"
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.path=/prometheus"
- "--web.console.libraries=/etc/prometheus/console_libraries"
- "--web.console.templates=/etc/prometheus/consoles"
- "--web.enable-lifecycle"
- "--web.enable-admin-api"
ports:
- "9090:9090"
networks:
- monitoring
labels:
com.centurylinklabs.watchtower.enable: "true"
mosquitto:
image: eclipse-mosquitto:latest
container_name: mosquitto
restart: always
ports:
- "1883:1883"
networks:
- monitoring
volumes:
- ./mosquitto/mosquitto.conf:/mosquitto/config/mosquitto.conf
labels:
com.centurylinklabs.watchtower.enable: "true"
loki:
image: grafana/loki:latest
container_name: loki
restart: unless-stopped
ports:
- "3100:3100"
command:
- "-config.file=/etc/loki/local-config.yaml"
networks:
- monitoring
promtail:
image: grafana/promtail:latest
container_name: promtail
volumes:
- /var/log:/var/log
command:
- "-config.file=/etc/promtail/config.yml"
networks:
- monitoring
grafana:
image: grafana/grafana:latest
container_name: grafana
volumes:
- grafana_data:/var/lib/grafana
- ./grafana/provisioning/dashboards:/etc/grafana/provisioning/dashboards
- ./grafana/provisioning/datasources:/etc/grafana/provisioning/datasources
- ./grafana/conf/grafana.ini:/etc/grafana/grafana.ini
environment:
- GF_SECURITY_ADMIN_USER=${GRAFANA_ADMIN_USER}
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD}
- GF_USERS_ALLOW_SIGN_UP=false
- GF_SMTP_ENABLED=true
- GF_SMTP_HOST=${GF_SMTP_HOST}
- GF_SMTP_USER=${GF_SMTP_USER}
- GF_SMTP_PASSWORD=${GF_SMTP_PASSWORD}
- GF_SMTP_FROM_ADDRESS=${GF_SMTP_FROM_ADDRESS}
restart: unless-stopped
ports:
- "3000:3000"
networks:
- monitoring
labels:
com.centurylinklabs.watchtower.enable: "true"里面直接包含了 Prometheus + Grafana + node_exporter + 一些环境,十分方便(来自NodeSeek论坛的@Testcharon)
②设置 Prometheus + Grafana 的配置文件夹
我们要先创建一些配置文件夹以免 Docker 编译失败,首先先配置 Prometheus 的配置:
mkdir -p /home/docker/prometheus/prometheus/ # 创建配置文件夹
vim /home/docker/prometheus/prometheus/prometheus.yml # 创建配置文件在配置文件里写入以下内容(带注释):
global:
scrape_interval: 15s
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
- job_name: "node_exporter"
scrape_interval: 10s
static_configs:
- targets: ["服务器地址:9100"] # 按照这些情况来进行配置被控服务器
labels:
instance: '服务器1'
- targets: ["服务器地址:9100"]
labels:
instance: '服务器2'这些内容就是配置被控服务器的所有内容了!没错,Prometheus这个监控面板是被动访问被控服务器的地址来获取信息的,并非我们常见的Nezha、Komari等监控面板又被控服务器主动上传数据到监控端的。
接下来的话,我们将配置 Grafana 的配置文件:
mkdir -p /home/docker/prometheus/grafana/conf/ # 创建文件夹
mkdir -p /home/docker/prometheus/grafana/provisioning/dashboards/ # 创建文件夹
mkdir -p /home/docker/prometheus/grafana/provisioning/datasources/ # 创建文件夹
vim /home/docker/prometheus/grafana/conf/grafana.ini # 创建配置文件在配置文件 Grafana.ini 中写入以下内容:
[server]
protocol = http
http_port = 3000
domain = status.mclzyun.com
root_url = http://localhost:3000 # Grafana 的访问 URL
serve_from_sub_path = false到这里的话你可能会发现,Grafana其实就是一个前端面板,就好比 Prometheus 是收集服务器信息,而 Grafana 是用来展示给大家看的。
最后的话我们创建最后一个配置文件,mosquitto:
mkdir -p /home/docker/prometheus/mosquitto/ # 创建文件夹
vim /home/docker/prometheus/mosquitto/mosquitto.conf # 创建配置文件随便写点东西进去:
listener 1883
allow_anonymous true
persistence true
persistence_location /mosquitto/data/
log_dest stdout③开始编译
保存完 docker-compose.yml 之后在和文件同目录下输入以下命令:
docker compose up -dDocker Compose 就开始编译了:

上面的警告可以不用管,这是缺少环境变量导致的错误,如果需要,就在目录下创建文件 .env 来进行补充。
三、测试监控端并对接
1、测试
确认无任何报错之后可以打开看看 Prometheus:
http://改成你服务器IP:9090

接着打开 Grafana 看看能不能访问:
http://改成你服务器IP:3000
默认的账号密码均为:admin,第一次进入要求你更改密码(当然可以直接跳过 Skip),默认语言是英语,汉化流程如下:


2、Grafana对接Prometheus
接下来我们要在 Grafana 平台上对接 Prometheus 上,首先点击菜单栏左侧的:



名称随意,但是链接地址得更改成:

http://prometheus:9090因为Prometheus和Grafana都在同一个容器内,不能用作于 localhost 连接,包括我们后面的 node_exporter 都是一样的。
保存测试连接,就成功对接上了!

3、配置Grafana主题
正如开头你所见我的监控页面,就是基于主题所展现的内容,如何添加主题呢?



22403(英文) / 22869(中文),来自:NodeSeek就可以直接应用上和我同款的主题了!
三、配置被控端
配置被控端就很简单了只需要一个 node_exporter 即可:
1、安装node_exporter:
直接复制下面命令即可:(来自@AhFei)的脚本
# 获取 Prometheus 最新版本
github_project="prometheus/node_exporter"
tag=$(wget -qO- -t1 -T2 "https://api.github.com/repos/${github_project}/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g')
echo ${tag}
echo ${tag#*v}
wget https://github.com/prometheus/node_exporter/releases/download/${tag}/node_exporter-${tag#*v}.linux-amd64.tar.gz && \
tar xvfz node_exporter-*.tar.gz && \
rm node_exporter-*.tar.gz
mv node_exporter-*.linux-amd64/node_exporter /usr/local/bin
rm -r node_exporter-*.linux-amd64*
useradd -rs /bin/false node_exporter
cat > /etc/systemd/system/node_exporter.service <<EOF
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now node_exporter
systemctl status node_exporter直接输入即可,不需要配置任何的东西,因为是监控端主动访问被控端的,到时候写好 IP:9100 端口即可(除了容器内的必须写:node-exporter:9100,就是监控端监控自己)
2、配置防火墙
因为 node_exporter 本身是没有任何防护措施的,也就以为着只要知道你的IP,就可以直接监控你的服务器了!十分不安全!给大家整理好 ufw 的命令,直接输入即可:
apt -y install ufw # 安装 ufw
ufw --force enable # 打开 ufw
ufw default allow incoming # 打开入站
ufw default allow outgoing # 打开出站
ufw delete allow 9100 # 删除9100端口
ufw allow from 监控端服务器IP to any port 9100 comment 'node_exporter only' # 设置只能指定IP访问9100
ufw deny 9100
ufw allow from 监控端服务器IP to any port 9100 comment 'node_exporter only'
ufw status verbose
ufw --force enable我的 ufw 配置文件的内容大概是:
- 所有的端口都默认开放(除了 9100)
- 9100端口只能被指定IP访问
配置完后如何测试是否配置成功?使用 itdog 的Tcping 来进行检测 9100端口是否能被访问,如果不能被访问就测试监控端服务器是否能访问上被控端:
telnet 被控端IP 9100显示 Connected 就证明你配置成功了!

接下来的话,就是依次在 Prometheus.yml 配置好每一个被监控端服务器的信息和名称!
四、添加报警途径&离线通知
1、添加联络点
接下来我们以腾讯企业微信机器人为报警联络点为例子为大家展示如何添加报警途径:(我省略了创建机器人的步骤,需要的话多搜索即可)




保存后测试即可!
2、添加通知模板
我们可以自定义自己的通知模板


{{ define "默认通知模板" }}
{{ if gt (len .Alerts.Firing) 0 }}
==============================
🚨 服务器告警触发 🚨
==============================
{{ else }}
==============================
✅ 告警已恢复 ✅
==============================
{{ end }}
告警名称:
{{ if .CommonLabels.alertname }}
{{ .CommonLabels.alertname }}
{{ else }}
未知告警
{{ end }}
告警状态:{{ if gt (len .Alerts.Firing) 0 }}FIRING{{ else }}RESOLVED{{ end }}
标签信息:
{{ range .CommonLabels.SortedPairs }}
- {{ .Name }} = {{ .Value }}
{{ end }}
{{ if gt (len .Alerts.Firing) 0 }}
触发时间:{{ (index .Alerts.Firing 0).StartsAt.Format "2006-01-02 15:04:05" }}
描述信息:
{{ if .CommonAnnotations.description }}
{{ .CommonAnnotations.description }}
{{ else }}
无描述信息
{{ end }}
{{ else }}
恢复时间:{{ (index .Alerts.Resolved 0).EndsAt.Format "2006-01-02 15:04:05" }}
{{ end }}
Grafana 地址:
{{ .ExternalURL }}
==============================
{{ end }}保存即可!
3、设置离线通知


- 名称随意啦
- Metric:检测条件,up就是看服务器还或者不
- job:就是我们创建的一整个被监控的服务器组(也就是选择检测谁up)
- Type:选择 Range 就是限定时间范围,Instant就是瞬时(服务器一掉线就检测到)
- 下面提醒条件很好理解,就是当 up 不是 == 1 的时候就报警


那么,以上就是本篇博客的所有内容!感谢各位的阅读!
