内网环境安装Prometheus用于检测服务器CPU、内存等状态,并设置邮件报警或API报警
一、前言
本文档3~6章节旨在详细介绍 Prometheus、Alertmanager 及 node_exporter 的手动安装、配置与启动流程。
第八章给出自动化部署脚本,在修改部分配置后可一键部署。
报警方式为邮件报警和API报警:邮件报警需要准备两个邮箱;API报警是指当触发报警后发送报警信息到指定API:eg.http://192.168.98.112:8089/alert 本文将会提供一个用于接收报警信息的python脚本(没有py运行环境就发给ai换成其他的语言。脚本作用:处理来自8089的 /alert 路径的请求,读取其数据并输出到终端)。可随意选择这两种报警方式
通过本文档,您将完成从环境检查到服务部署、监控配置及告警设置的全流程操作,最终实现对服务器 CPU、内存等核心指标的监控及告警功能。
- Prometheus:开源的系统监控和告警工具,用于收集和存储时间序列数据。
- node_exporter:用于收集服务器硬件和操作系统指标的 exporter。
- Alertmanager:处理 Prometheus 产生的告警,支持告警聚合、路由、抑制等功能。
理论上,安装包版本一致且端口没被占用,以下内容,除了更换报警所需的邮箱和API目标服务器IP端口,其他均可直接照抄,过程中遇到问题欢迎评论区讨论,或邮件联系1735487493@qq.com
二、准备
往官网页下载Download | Prometheus
本文示例如下(是从github下载的)
- Prometheus:
prometheus-3.5.0.linux-amd64.tar.gz - Alertmanager:
alertmanager-0.28.1.linux-amd64.tar.gz - node_exporter:
node_exporter-1.9.1.linux-amd64.tar.gz
如若换成其他版本,理论上仅需要稍稍修改一下版本号而已
服务器功能仅需要:tar解压;vi/vim编辑文件;ss检查端口是否被占用。服务器不需要接入互联网
三、端口占用检查
在安装前,需确保 Prometheus 及相关组件所需端口未被占用(避免启动失败)。需检查的端口如下:
- Prometheus:9090(默认服务端口)
- node_exporter:9100(默认指标暴露端口)
- Alertmanager:9093(默认服务端口)
执行以下命令检查端口占用情况:
# 检查 9090 端口(Prometheus)
ss -tuln | grep :9090
# 检查 9100 端口(node_exporter)
ss -tuln | grep :9100
# 检查 9093 端口(Alertmanager)
ss -tuln | grep :9093
- 若命令无输出,说明端口未被占用,可继续操作;
- 若有输出,需先停止占用端口的进程,或修改后续配置中的端口。
四、安装组件
4.1 解压安装包
将下载的安装包上传至服务器(任意相同目录,需要cd目录下操作,安装完成后会删除压缩包),执行以下命令解压:
# 解压 Prometheus
tar xvf prometheus-3.5.0.linux-amd64.tar.gz
# 解压 Alertmanager
tar xvf alertmanager-0.28.1.linux-amd64.tar.gz
# 解压 node_exporter
tar xvf node_exporter-1.9.1.linux-amd64.tar.gz
4.2 创建安装目录
为统一管理组件,创建主安装目录及子目录:
sudo mkdir -p /usr/local/Prometheus/prometheus # Prometheus 主目录
sudo mkdir -p /usr/local/Prometheus/alertmanager # Alertmanager 主目录
sudo mkdir -p /usr/local/Prometheus/node_exporter # node_exporter 主目录
4.3 移动文件至安装目录
将解压后的文件移动到目标目录(保留文件权限,确保服务可正常执行):
# 移动 Prometheus 文件
sudo mv prometheus-3.5.0.linux-amd64/* /usr/local/Prometheus/prometheus/
# 移动 Alertmanager 文件
sudo mv alertmanager-0.28.1.linux-amd64/* /usr/local/Prometheus/alertmanager/
# 移动 node_exporter 文件
sudo mv node_exporter-1.9.1.linux-amd64/* /usr/local/Prometheus/node_exporter/
4.4 清理临时文件
删除解压后的空目录及安装包,释放空间:
# 删除空目录
rmdir prometheus-3.5.0.linux-amd64
rmdir alertmanager-0.28.1.linux-amd64
rmdir node_exporter-1.9.1.linux-amd64
# 删除安装包
rm -f prometheus-3.5.0.linux-amd64.tar.gz
rm -f alertmanager-0.28.1.linux-amd64.tar.gz
rm -f node_exporter-1.9.1.linux-amd64.tar.gz
4.5 验证安装文件
检查组件版本,确认文件移动成功:
# 验证 Prometheus 版本
/usr/local/Prometheus/prometheus/prometheus --version
# 验证 Alertmanager 版本
/usr/local/Prometheus/alertmanager/alertmanager --version
# 验证 node_exporter 版本
/usr/local/Prometheus/node_exporter/node_exporter --version
若输出类似 prometheus, version 3.5.0 的信息,说明安装文件正常。
五、配置组件
5.1 配置 node_exporter
node_exporter 用于收集服务器指标,需通过 systemd 配置为系统服务,实现开机自启。
5.1.1 创建系统服务文件
sudo vi /etc/systemd/system/node_exporter.service
添加以下内容(定义服务参数):
[Unit]
Description=Node Exporter # 服务描述
After=network.target # 网络启动后启动该服务
[Service]
User=root # 运行服务的用户(可根据需求修改为普通用户)
# 启动命令:指定监听地址(127.0.0.1:9100 表示仅本地可访问,如需远程访问可改为 0.0.0.0:9100)
ExecStart=/usr/local/Prometheus/node_exporter/node_exporter --web.listen-address=127.0.0.1:9100
Restart=on-failure # 服务失败时自动重启
[Install]
WantedBy=multi-user.target # 多用户模式下启动
5.1.2 启动并设置开机自启
# 重新加载 systemd 配置(使新服务生效)
sudo systemctl daemon-reload
# 启动 node_exporter 服务
sudo systemctl start node_exporter
# 设置开机自启
sudo systemctl enable node_exporter
5.2 配置 Prometheus
Prometheus 负责收集指标、配置监控目标及告警规则,需配置主配置文件、告警规则文件及系统服务。
5.2.1 配置主配置文件(prometheus.yml)
编辑主配置文件:
sudo vi /usr/local/Prometheus/prometheus/prometheus.yml
添加以下内容(核心配置说明见注释):
global:
scrape_interval: 15s # 指标采集间隔(默认15秒)
evaluation_interval: 15s # 告警规则评估间隔(默认15秒)
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093'] # Alertmanager 地址(用于发送告警)
rule_files:
- "alert_rules.yml" # 告警规则文件路径(后面将会创建)
scrape_configs:
# 监控 Prometheus 自身
- job_name: "prometheus"
static_configs:
- targets: ['localhost:9090'] # Prometheus 自身地址
labels:
app: "prometheus" # 自定义标签(便于筛选)
# 监控 node_exporter
- job_name: "node"
static_configs:
- targets: ['localhost:9100'] # node_exporter 地址
labels:
app: "node_exporter" # 自定义标签
5.2.2 创建告警规则文件(alert_rules.yml)
告警规则定义了触发告警的条件(如 CPU 使用率过高),编辑文件:
sudo vi /usr/local/Prometheus/prometheus/alert_rules.yml
添加以下内容(示例规则说明见注释,可自主设置‘警戒线’,根据自己的需求修改):
groups:
- name: server_alerts # 规则组名称
rules:
# 高 CPU 使用率告警
- alert: HighCPUUsage # 告警名称
expr: 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
# expr 说明:计算 CPU 使用率(100 - 空闲率),当 >80% 时触发
for: 2m # 持续 2 分钟满足条件才触发告警(避免瞬时波动)
labels:
severity: critical # 告警级别(如 critical、warning)
annotations:
summary: "高CPU使用率告警 ({{ $labels.instance }})" # 告警摘要(包含实例信息)
description: "CPU使用率超过80%已持续2分钟 (当前值: {{ $value }})" # 告警详情(包含当前值)
# 高内存使用率告警
- alert: HighMemoryUsage # 告警名称
expr: (node_memory_Active_bytes / node_memory_Total_bytes) * 100 > 80
# expr 说明:计算内存使用率(活跃内存/总内存),当 >80% 时触发
for: 2m # 持续 2 分钟满足条件才触发
labels:
severity: critical
annotations:
summary: "高内存使用率告警 ({{ $labels.instance }})"
description: "内存使用率超过80%已持续2分钟 (当前值: {{ $value }})"
5.2.3 创建 Prometheus 系统服务
编辑服务文件:
sudo vi /etc/systemd/system/prometheus.service
添加以下内容:
[Unit]
Description=Prometheus # 服务描述
After=network.target # 网络启动后启动
[Service]
User=root # 运行用户
# 启动命令:指定配置文件、数据存储路径、监听地址
ExecStart=/usr/local/Prometheus/prometheus/prometheus
--config.file=/usr/local/Prometheus/prometheus/prometheus.yml
--storage.tsdb.path=/usr/local/Prometheus/prometheus/data # 指标数据存储路径
--web.listen-address=127.0.0.1:9090 # 监听地址(仅本地可访问,远程访问改 0.0.0.0:9090)
Restart=on-failure # 失败时重启
[Install]
WantedBy=multi-user.target
5.2.4 启动并设置开机自启
# 重新加载 systemd 配置
sudo systemctl daemon-reload
# 启动 Prometheus 服务
sudo systemctl start prometheus
# 设置开机自启
sudo systemctl enable prometheus
5.3 配置 Alertmanager
Alertmanager 负责处理 Prometheus 发送的告警,并通过邮件等方式通知用户。本文以 QQ 邮箱为例配置邮件告警。
5.3.1 配置 Alertmanager 主配置文件
编辑配置文件:
sudo vi /usr/local/Prometheus/alertmanager/alertmanager.yml
添加以下内容(需替换为您的邮箱信息,和接收报警的脚本接口。参数说明见注释):
global:
# 邮件服务器配置(QQ邮箱示例,其他邮箱需修改对应参数)
smtp_smarthost: 'smtp.qq.com:587' # SMTP 服务器地址及端口(QQ邮箱为 587)
smtp_from: '35367***23@qq.com' # 发送告警的邮箱地址
smtp_auth_username: '35367***23@qq.com' # 邮箱用户名(与发送地址一致)
smtp_auth_password: 'aox*******aji' # 邮箱授权码(QQ邮箱需开启 SMTP 并获取授权码,非登录密码)
smtp_require_tls: true # 启用 TLS 加密(必填)
route:
group_by: ['alertname'] # 按告警名称分组
group_wait: 10s # 组内第一个告警触发后,等待 10s 再发送(聚合同组告警)
group_interval: 10s # 同组告警再次触发的间隔
repeat_interval: 1h # 同一告警重复发送的间隔(避免频繁告警)
receiver: 'email-notifications' # 接收者名称(需与下方 receivers 匹配)
receivers:
- name: 'email-notifications' # 接收者名称(与上面 route.receiver 一致)
email_configs:
- to: '1735******93@qq.com' # 接收告警的邮箱地址(替换为您的邮箱)
webhook_configs: #不需要API报警可把这三行删去
- url: 'http://192.168.98.112:8089/alert' # 脚本的地址和端口
send_resolved: true # 正确位置:缩进在 webhook_configs 内部
注意:QQ 邮箱需先在「设置 - 账户」中开启「SMTP 服务」,并获取授权码(
smtp_auth_password需填写授权码)。可参考:新版QQ邮箱授权码获取教程【最新】 - WordPress外贸建站专家
5.3.2 创建 Alertmanager 系统服务
编辑服务文件:
sudo vi /etc/systemd/system/alertmanager.service
添加以下内容:
[Unit]
Description=Alertmanager # 服务描述
After=network.target # 网络启动后启动
[Service]
User=root # 运行用户
# 启动命令:指定配置文件、数据存储路径、监听地址
ExecStart=/usr/local/Prometheus/alertmanager/alertmanager
--config.file=/usr/local/Prometheus/alertmanager/alertmanager.yml
--storage.path=/usr/local/Prometheus/alertmanager/data # 告警数据存储路径
--web.listen-address=127.0.0.1:9093 # 监听地址(仅本地可访问,远程访问改 0.0.0.0:9093)
Restart=on-failure # 失败时重启
[Install]
WantedBy=multi-user.target
5.3.3 启动并设置开机自启
# 重新加载 systemd 配置
sudo systemctl daemon-reload
# 启动 Alertmanager 服务
sudo systemctl start alertmanager
# 设置开机自启
sudo systemctl enable alertmanager
六、验证服务状态
6.1 检查服务运行状态
执行以下命令确认所有服务正常启动:
# 检查 node_exporter 状态
sudo systemctl status node_exporter
# 检查 Prometheus 状态
sudo systemctl status prometheus
# 检查 Alertmanager 状态
sudo systemctl status alertmanager
若输出中包含 active (running),说明服务启动成功。
6.2 如若出现错误,看日志
# 查看 Prometheus 最新日志(按 Ctrl+C 退出)
sudo journalctl -u prometheus -f --no-pager
# 查看 Alertmanager 最新日志
sudo journalctl -u alertmanager -f --no-pager
# 查看 Node Exporter 最新日志
sudo journalctl -u node_exporter -f --no-pager
6.3 修改配置后要重启才生效
sudo systemctl daemon-reload
# 重启 Node Exporter(监控数据源)
sudo systemctl restart node_exporter
# 重启 Prometheus(监控核心,拉取数据、执行告警规则)
sudo systemctl restart prometheus
# 重启 Alertmanager(告警组件,发送告警通知)
sudo systemctl restart alertmanager
七、部署个用于接收报警信息的脚本(可以不搞这章)
这个脚本的作用是配合前面(5.3.1 配置 Alertmanager 主配置文件)
如果您需要通过api报警,那就要保留Alertmanager 配置文件的最后那三行。再选择部署下面这个python脚本或者您自己的API来接收报警信息
若选择用这个python脚本接收报警信息,您需要在您的任意Prometheus 能访问到的主机运行下面脚本,再修改Alertmanager 配置文件上的ip为脚本所在的主机。
from http.server import BaseHTTPRequestHandler, HTTPServer
import json
import logging
# 配置日志,方便查看接收的告警信息
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s')
logger = logging.getLogger(__name__)
# 自定义请求处理器,处理 POST 请求
class AlertHandler(BaseHTTPRequestHandler):
def _set_response(self):
# 设置响应状态码为 200(成功)
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
def do_POST(self):
# 仅处理 /alert 路径的请求
if self.path != '/alert':
self.send_response(404)
self.end_headers()
return
# 读取请求体数据
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
try:
# 解析 JSON 格式的告警数据
alert_data = json.loads(post_data.decode('utf-8'))
logger.info("收到告警信息:")
# 格式化打印 JSON 数据,方便阅读
logger.info(json.dumps(alert_data, indent=2, ensure_ascii=False))
except json.JSONDecodeError:
logger.error("告警数据格式错误,无法解析为 JSON")
logger.error(f"原始数据:{post_data.decode('utf-8')}")
# 返回成功响应
self._set_response()
self.wfile.write(json.dumps({"status": "success", "message": "告警已接收"}).encode('utf-8'))
# 启动 HTTP 服务
def run(server_class=HTTPServer, handler_class=AlertHandler, port=8080):
server_address = ('', port)
httpd = server_class(server_address, handler_class)
logger.info(f"启动告警接收服务,监听端口 {port},接口路径:/alert")
try:
httpd.serve_forever()
except KeyboardInterrupt:
pass
httpd.server_close()
logger.info("服务已停止")
if __name__ == '__main__':
# 默认端口 8080,可根据需要修改
run(port=8089)
八、脚本部署
此脚本实际上只是把前面的简单操作换成了脚本执行,若是前面的操作出了问题,那这个脚本也大概率不行。
和前面的内容一样,在运行脚本前,要找到脚本里的邮箱设置和报警API那部分(搜索qq就能找到),邮箱和api都要修改(如果要用API报警,那还要完成第七章)(参考5.3.1 配置 Alertmanager 主配置文件的注释)
可选择修改警戒线(搜索CPU可找到),这个根据自己的需求修改(5.2.2 创建告警规则文件)
将脚本保存为/usr/local/Prometheus/install_prometheus.sh
赋予执行权限:chmod +x /usr/local/Prometheus/install_prometheus.sh
运行脚本:sudo ./install_prometheus.sh
脚本执行前请确保三个 tar 包(prometheus-3.5.0.linux-amd64.tar.gz、alertmanager-0.28.1.linux- amd64.tar.gz、node_exporter-1.9.1.linux-amd64.tar.gz)已放在在/usr/local/Prometheus/目录下
#!/bin/bash
set -e # 遇到错误立即退出
# 检查是否以root权限运行
if [ "$(id -u)" -ne 0 ]; then
echo "错误:请使用root权限运行此脚本(sudo ./install_prometheus.sh)"
exit 1
fi
# 定义安装路径和文件名
BASE_DIR="/usr/local"
PROM_DIR="${BASE_DIR}/Prometheus"
PROM_TAR="prometheus-3.5.0.linux-amd64.tar.gz"
ALERT_TAR="alertmanager-0.28.1.linux-amd64.tar.gz"
NODE_TAR="node_exporter-1.9.1.linux-amd64.tar.gz"
# 步骤1:检查端口占用情况
echo "===== 检查必要端口占用情况 ====="
ss -tuln | grep -E ":9090|:9100|:9093" || echo "端口未被占用,继续安装"
# 步骤2:解压安装包
echo -e "
===== 解压安装包 ====="
cd ${BASE_DIR}
tar xvf ${PROM_TAR}
tar xvf ${ALERT_TAR}
tar xvf ${NODE_TAR}
# 步骤3:创建安装目录并移动文件
echo -e "
===== 配置安装目录 ====="
mkdir -p ${PROM_DIR}/{prometheus,alertmanager,node_exporter}
mv prometheus-3.5.0.linux-amd64/* ${PROM_DIR}/prometheus/
mv alertmanager-0.28.1.linux-amd64/* ${PROM_DIR}/alertmanager/
mv node_exporter-1.9.1.linux-amd64/* ${PROM_DIR}/node_exporter/
# 清理临时文件
rmdir prometheus-3.5.0.linux-amd64 alertmanager-0.28.1.linux-amd64 node_exporter-1.9.1.linux-amd64
rm -f ${PROM_TAR} ${ALERT_TAR} ${NODE_TAR}
# 步骤4:验证版本
echo -e "
===== 验证组件版本 ====="
${PROM_DIR}/prometheus/prometheus --version
${PROM_DIR}/alertmanager/alertmanager --version
${PROM_DIR}/node_exporter/node_exporter --version
# 步骤5:配置Node Exporter服务
echo -e "
===== 配置Node Exporter ====="
cat > /etc/systemd/system/node_exporter.service << 'EOF'
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=root
ExecStart=/usr/local/Prometheus/node_exporter/node_exporter --web.listen-address=127.0.0.1:9100
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
# 步骤6:配置Prometheus
echo -e "
===== 配置Prometheus ====="
cat > ${PROM_DIR}/prometheus/prometheus.yml << 'EOF'
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093'] # Alertmanager的地址和端口
rule_files:
- "alert_rules.yml" # 告警规则文件路径
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ['localhost:9090']
labels:
app: "prometheus"
# 添加node_exporter监控配置
- job_name: "node"
static_configs:
- targets: ['localhost:9100']
labels:
app: "node_exporter"
EOF
# 创建告警规则文件
cat > ${PROM_DIR}/prometheus/alert_rules.yml << 'EOF'
groups:
- name: server_alerts
rules:
- alert: HighCPUUsage
expr: 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 2m
labels:
severity: critical
annotations:
summary: "高CPU使用率告警 ({{ $labels.instance }})"
description: "CPU使用率超过80%已持续2分钟 (当前值: {{ $value }})"
- alert: HighMemoryUsage
expr: (node_memory_Active_bytes / node_memory_Total_bytes) * 100 > 80
for: 2m
labels:
severity: critical
annotations:
summary: "高内存使用率告警 ({{ $labels.instance }})"
description: "内存使用率超过80%已持续2分钟 (当前值: {{ $value }})"
EOF
# 配置Prometheus服务
cat > /etc/systemd/system/prometheus.service << 'EOF'
[Unit]
Description=Prometheus
After=network.target
[Service]
User=root
ExecStart=/usr/local/Prometheus/prometheus/prometheus
--config.file=/usr/local/Prometheus/prometheus/prometheus.yml
--storage.tsdb.path=/usr/local/Prometheus/prometheus/data
--web.listen-address=127.0.0.1:9090
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
# 步骤7:配置Alertmanager
echo -e "
===== 配置Alertmanager ====="
cat > ${PROM_DIR}/alertmanager/alertmanager.yml << 'EOF'
global:
# 邮件服务器配置(以QQ邮箱为例)
smtp_smarthost: 'smtp.qq.com:587'
smtp_from: '3536722823@qq.com'
smtp_auth_username: '3536722823@qq.com'
smtp_auth_password: 'aoxepbtacznndaji' # QQ邮箱需要使用授权码而非密码
smtp_require_tls: true
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h # 重复发送告警的间隔
receiver: 'email-notifications'
receivers:
- name: 'email-notifications'
email_configs:
- to: '1735487493@qq.com' # 接收告警的邮箱地址
webhook_configs:
- url: 'http://192.168.98.112:8089/alert' # 脚本的地址和端口,修改成你自己的
send_resolved: true
EOF
# 注意:请根据实际情况修改上面的邮箱配置信息和API
# 配置Alertmanager服务
cat > /etc/systemd/system/alertmanager.service << 'EOF'
[Unit]
Description=Alertmanager
After=network.target
[Service]
User=root
ExecStart=/usr/local/Prometheus/alertmanager/alertmanager
--config.file=/usr/local/Prometheus/alertmanager/alertmanager.yml
--storage.path=/usr/local/Prometheus/alertmanager/data
--web.listen-address=127.0.0.1:9093
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
# 步骤8:启动服务并设置开机自启
echo -e "
===== 启动服务 ====="
systemctl daemon-reload
# 启动Node Exporter
systemctl start node_exporter
systemctl enable node_exporter
# 启动Prometheus
systemctl start prometheus
systemctl enable prometheus
# 启动Alertmanager
systemctl start alertmanager
systemctl enable alertmanager
# 步骤9:检查服务状态
echo -e "
===== 服务状态检查 ====="
systemctl status node_exporter --no-pager | grep "active (running)" && echo "Node Exporter 启动成功"
systemctl status prometheus --no-pager | grep "active (running)" && echo "Prometheus 启动成功"
systemctl status alertmanager --no-pager | grep "active (running)" && echo "Alertmanager 启动成功"
echo -e "
===== 所有组件安装完成 ====="
echo "注意:请确认Alertmanager的邮箱配置是否正确,如需修改请编辑:${PROM_DIR}/alertmanager/alertmanager.yml"
echo "修改后需执行:systemctl restart alertmanager"
三个组件,所以最后要出现三个active (running)才是部署成功








