Prometheus(一)—— Prometheus监控系统从入门到实战:理论与部署全指南
文章目录
- 前言
- 一、Prometheus监控系统概述
- 1.1 Prometheus 概述
- 1.2 TSDB:适配监控场景的存储引擎
- 1.3 Prometheus核心特点
- 二、Prometheus生态组件
- 2.1 Prometheus Server:服务核心组件
- 2.2 Client Library:客户端库
- 2.3 Exporter:指标暴露器
- 2.4 Service Discovery:动态服务发现
- 2.5 Alertmanager:告警管理中心
- 2.6 Pushgateway:短期任务数据中转站
- 2.7 Grafana:监控数据可视化工具
- 三、Prometheus工作模式与流程
- 3.1 核心工作模式
- 3.2 完整工作流程
- 四、Prometheus的局限性
- 五、Prometheus实战部署
- 5.1 环境准备
- 5.2 部署Prometheus Server(中枢节点)
- 5.2.1 解压与目录配置
- 5.2.2 配置系统服务(实现开机自启)
- 5.2.3 验证部署
- 5.3 部署Exporter(监控第三方服务)
- 5.3.1 部署Node-Exporter(监控服务器资源)(`所有节点执行`)
- 5.3.1.1 解压与安装
- 5.3.1.2 配置系统服务
- 5.3.1.3 验证与接入Prometheus
- 5.3.2 部署mysqld-exporter(监控MySQL数据库)
- 5.3.2.1 在MySQL服务器上操作
- 5.3.2.2 在Prometheus Server上添加MySQL监控配置
- 5.3.3 部署nginx-exporter(监控Nginx服务)
- 5.3.3.1 在Nginx服务器上操作
- 5.3.3.2 在Prometheus Server上添加Nginx监控配置
- 5.4 部署Grafana实现监控可视化
- 5.4.1 安装与启动Grafana(本文安装在监控中枢节点)
- 5.4.2 配置Prometheus数据源
- 5.4.3 导入监控仪表盘
- 5.5 部署Prometheus服务发现
- 5.5.1 基于文件的服务发现
- 5.5.2 基于Consul的服务发现
- 5.5.2.1 部署Consul服务
- 5.5.2.2 在Consul中注册监控服务
- 5.5.2.3 配置Prometheus对接Consul
- 5.5.3 基于Kubernetes API的服务发现
- 5.5.3.1 核心配置参数
- 5.5.3.2 示例配置(发现K8s Node节点)
- 总结
- 附录:常用资源链接
前言
在云原生与微服务架构普及的今天,一套高效的监控系统是保障业务稳定运行的核心支撑。Prometheus作为当前最主流的开源监控解决方案之一,凭借其灵活的多维数据模型、强大的查询语言PromQL、丰富的生态组件以及对云原生环境的良好适配,成为运维工程师和开发人员的首选工具。
本文将从Prometheus的基础理论出发,逐步深入其核心组件、工作原理与局限性,最终通过完整的实战步骤,带你完成Prometheus Server、Exporter、Grafana及服务发现的部署与配置。无论是监控服务器资源、MySQL数据库还是Nginx服务,你都能从本文找到可直接落地的操作指南,帮助你快速搭建企业级监控体系。
一、Prometheus监控系统概述
1.1 Prometheus 概述
Prometheus 是一个开源的 服务监控系统与时序数据库,具备统一的数据模型、高效的数据采集与灵活的查询能力。其核心组件 Prometheus Server 负责定期从静态配置或服务发现获得的监控目标中 拉取(Pull)数据,并将其持久化存储。
区别:Zabbbix是
推数据
。Zabbix Agent部署在被监控主机上,主动或被动地发送数据给 Server
被监控主机通过 Exporter 暴露监控指标接口,Prometheus 通过 HTTP 周期性抓取这些数据;若配置了告警规则,则会在采集后计算并将告警发送至 Alertmanager 进行汇总与分发。对于需要主动推送数据的场景,可通过 Pushgateway 临时接收与存储数据,等待 Prometheus 拉取。
监控目标可通过静态配置或 服务发现机制 动态管理,Prometheus 还能直接利用 Kubernetes API Server 实现自动发现和监控集群中的各类对象。
1.2 TSDB:适配监控场景的存储引擎
Prometheus默认使用TSDB(Time Series Database) 作为存储引擎,它之所以能完美契合监控数据的应用场景,核心源于以下特性:
1、支持海量数据存储:可高效处理监控场景下每秒产生的大量时序数据;
2、写入性能优先:监控数据以时间顺序持续产生,TSDB针对顺序写入做了深度优化;
3、数据更新极少:监控数据采集后通常无需修改,仅在数秒/数分钟后写入数据库;
4、删除策略高效:支持按时间范围批量删除历史数据,避免随机删除带来的性能损耗;
5、适配有序读取:监控查询读操作是十分典型的升序或者降序的顺序读。
6、支持高并发读:满足多用户同时查询监控数据的场景,如运维团队共同查看集群状态。
1.3 Prometheus核心特点
1、多维数据模型:所有监控数据以度量名称+键值对标签
标识的时序数据形式存储,便于按维度(如服务名、主机IP、环境)筛选查询;
2、内置时序数据库:默认使用TSDB存储数据,同时支持对接InfluxDB、OpenTSDB等外置远端存储;
3、灵活的查询语言PromQL:可基于标签快速筛选、聚合数据,支持计算平均值、增长率、分位数等指标;
4、数据采集方式灵活:
- 主流方式为基于HTTP的Pull(拉取)模式,定期从目标节点获取数据;
- 支持通过Pushgateway接收短期任务的Push(推送)数据,弥补Pull模式的不足;
5、目标发现机制:可通过静态配置直接指定监控目标,或通过DNS、Consul、Kubernetes等实现动态服务发现;
6、可视化与告警集成:支持接入Grafana展示数据,配合Alertmanager实现告警的去重、分组与多渠道分发。
二、Prometheus生态组件
Prometheus并非单一工具,而是由多个组件构成的生态系统。其中Prometheus Server
是核心,其他组件按需部署,共同实现数据采集-存储-分析-可视化-告警
的完整监控链路。
2.1 Prometheus Server:服务核心组件
Prometheus Server是整个监控系统的中枢,主要负责数据采集、存储与告警规则计算,由三个核心模块组成:
1、Retrieval(数据采集模块):定期从配置的监控目标(Target)中拉取指标数据,支持HTTP协议;
2、Storage(存储模块):将采集到的时序数据持久化到本地磁盘(TSDB),默认保留15天数据,可通过配置调整;
3、PromQL(查询模块):提供PromQL查询语言支持,用户可通过Web UI或API调用该模块查询存储的监控数据。
2.2 Client Library:客户端库
Client Library是为开发人员设计的客户端库(支持Go、Java、Python等多语言),目的在于为那些期望原生提供Instrumentation 功能的应用程序提供便捷的开发途径,用于在应用程序内部原生埋点并暴露监控指标。
例如,通过Go语言的prometheus/client_golang
库,可在应用中定义“接口请求量”“接口响应时间”等自定义指标,并自动暴露HTTP接口供Prometheus Server拉取,无需依赖额外的Exporter。
2.3 Exporter:指标暴露器
对于不支持内置监控埋点(Instrumentation)的应用(如MySQL、Nginx、服务器操作系统),需通过Exporter采集指标。Exporter的核心作用是从目标服务收集原始数据,转换为Prometheus格式并通过HTTP接口暴露。
常用Exporter及功能如下:
1、Node-Exporter:监控服务器节点资源,如CPU使用率、内存占用、磁盘IO、网络流量等,需部署到所有待监控的主机;
2、mysqld-exporter:采集MySQL数据库指标,如连接数、QPS、慢查询数、表空间大小等;
3、nginx-exporter(如nginx-vts-exporter):采集Nginx服务的流量、请求数、响应状态码等指标,需配合Nginx的nginx-module-vts
模块使用;
4、Kube-State-Metrics:监控Kubernetes集群资源状态,如Pod运行状态、Deployment副本数、Service endpoints数量等,需部署在K8s集群内;
5、cAdvisor:采集容器资源使用情况,如容器的CPU使用率、内存占用、磁盘IO等,常与K8s集成;
6、blackbox-exporter:监控业务容器的存活性,支持HTTP、TCP、ICMP等协议的探测。
2.4 Service Discovery:动态服务发现
Service Discovery(服务发现)用于动态识别并管理监控目标,避免了静态配置中“新增节点需手动修改配置”的问题。Prometheus支持多种服务发现机制:
- 文件发现:通过定期读取YAML/JSON文件获取目标列表;
- DNS发现:通过DNS解析获取目标地址;
- 第三方服务发现:如Consul、Kubernetes、etcd等,直接对接第三方系统的API获取目标。
该组件已内置在Prometheus Server中,无需单独部署。
2.5 Alertmanager:告警管理中心
Alertmanager是独立的告警模块,负责接收、处理Prometheus Server发送的告警通知,核心功能包括:
1、去重:同一时间段内相同告警只发送一次,避免重复打扰;
2、分组:将关联告警(如同一主机的CPU、内存告警)合并为一条通知,便于问题定位;
3、路由:根据告警级别或标签,将告警分发到不同渠道(如邮件、钉钉、企业微信);
4、抑制:当某个核心告警(如主机宕机)触发后,抑制该主机上的其他次要告警(如应用端口不可达),减少冗余信息。
2.6 Pushgateway:短期任务数据中转站
Prometheus Server默认使用Pull模式拉取数据,但对于生命周期极短的短期任务(如临时脚本、定时任务),Pull模式无法及时采集数据。此时可通过Pushgateway实现:
1、短期任务主动将数据Push到Pushgateway;
2、Prometheus Server定期从Pushgateway拉取数据,实现短期任务的监控覆盖。
需注意:Pushgateway仅临时存储数据,不负责持久化,数据最终仍需存储到Prometheus的TSDB中。
2.7 Grafana:监控数据可视化工具
Grafana是开源的跨平台度量分析与可视化工具,支持对接Prometheus、InfluxDB等多种数据源,核心价值在于:
1、提供丰富的仪表盘模板:官方库包含大量现成模板(如Node-Exporter监控面板、MySQL监控面板),无需从零开发;
2、支持自定义可视化图表:可按需创建折线图、柱状图、仪表盘等,直观展示指标趋势;
3、告警集成:可基于监控数据设置阈值告警,支持邮件、Slack等渠道。
三、Prometheus工作模式与流程
3.1 核心工作模式
Prometheus的工作模式围绕数据采集-存储-查询-告警
四大环节展开,核心逻辑如下:
1、目标发现:Prometheus Server通过静态配置或服务发现(Service Discovery)机制,获取待监控的Target列表;
2、数据采集:Retrieval模块定期(默认15秒)通过HTTP协议从Target的Exporter/Client Library接口拉取指标数据;
3、数据存储:采集到的数据由Storage模块写入TSDB,按时间序列持久化到本地磁盘;
4、查询与可视化:用户通过PromQL查询数据,可在Prometheus Web UI查看原始数据,或通过Grafana生成可视化仪表盘;
5、告警触发:Prometheus Server定期(默认15秒)检查告警规则,满足条件的告警发送至Alertmanager,由其完成告警分发。
3.2 完整工作流程
1、Prometheus 以 Prometheus Server 为核心组件,负责采集和存储时序数据。Server 通过 Pull 模式 从监控目标中拉取指标数据,或通过 Pushgateway 接收主动上报的数据。
2、Prometheus Server 将采集到的监控指标以时间序列的形式存储在本地的 TSDB(Time Series Database) 中,支持 HDD 或 SSD 存储介质。
3、采集的监控数据按时间序列存储后,可根据预先配置的 告警规则(Alert Rules) 进行分析,触发的告警信息会发送至 Alertmanager。
4、Alertmanager 负责统一处理告警事件,并根据配置的告警接收渠道,将告警通知发送至 邮件、钉钉、企业微信 等目标。
5、Prometheus 自带 Web UI,并支持使用 PromQL 查询语言,对监控数据进行灵活查询与分析。
6、Grafana 可接入 Prometheus 作为数据源,将监控数据以可视化的图表方式呈现,实现更直观的监控展示。
四、Prometheus的局限性
尽管Prometheus功能强大,但在实际使用中需注意其局限性,避免场景错配:
- 不适合存储事件与日志:Prometheus的核心是“指标监控”(如CPU使用率、请求量),无法高效存储非结构化的日志数据或离散的事件数据(如Pod重启事件),需搭配ELK Stack(日志)、Falco(安全事件)等工具;
- 本地存储仅支持短期数据:TSDB默认仅保留15天数据,且本地磁盘容量有限,若需存储数月甚至数年的历史数据,需对接InfluxDB、OpenTSDB等远端存储;
- 集群机制成熟度较低:原生Prometheus不支持集群部署,单点存在可用性风险。若需高可用或联邦监控(多集群统一监控),需依赖Thanos、Cortex等第三方工具实现。
五、Prometheus实战部署
5.1 环境准备
1、环境规划
环境角色 | IP地址 | 部署核心组件 |
---|---|---|
监控中枢节点 | 192.168.10.18 | Prometheus Server、Grafana、Consul、Node-Exporter |
MySQL业务监控节点 | 192.168.10.21 | MySQL Server、mysqld-exporter、Node-Exporter |
Nginx业务监控节点 | 192.168.10.22 | Nginx(含vts模块)、Nginx-exporter、Node-Exporter |
2、关闭防火墙与SELinux(所有节点执行
):
systemctl stop firewalld
systemctl disable firewalld
setenforce 0 # 临时关闭SELinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config # 永久关闭
5.2 部署Prometheus Server(中枢节点)
5.2.1 解压与目录配置
1、上传软件包到/opt
目录并解压:
cd /opt
# 若未上传,可通过wget直接下载(需联网)
# wget https://github.com/prometheus/prometheus/releases/download/v2.35.0/prometheus-2.35.0.linux-amd64.tar.gz
tar xf prometheus-2.35.0.linux-amd64.tar.gz
# 移动到标准目录,便于管理
mv prometheus-2.35.0.linux-amd64 /usr/local/prometheus
2、查看默认配置文件(验证解压是否正常):
cat /usr/local/prometheus/prometheus.yml | grep -v "^#" # 过滤注释,查看核心配置
默认配置解读:
global: #用于prometheus的全局配置,比如采集间隔,抓取超时时间等scrape_interval: 15s #采集目标主机监控数据的时间间隔,默认为1mevaluation_interval: 15s #触发告警生成alert的时间间隔,默认是1m# scrape_timeout is set to the global default (10s).scrape_timeout: 10s #数据采集超时时间,默认10salerting: #用于alertmanager实例的配置,支持静态配置和动态服务发现的机制alertmanagers:- static_configs:- targets:# - alertmanager:9093rule_files: #用于加载告警规则相关的文件路径的配置,可以使用文件名通配机制# - "first_rules.yml"# - "second_rules.yml"scrape_configs: #用于采集时序数据源的配置# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.- job_name: "prometheus" #每个被监控实例的集合用job_name命名,支持静态配置(static_configs)和动态服务发现的机制(*_sd_configs)# metrics_path defaults to '/metrics'metrics_path: '/metrics' #指标数据采集路径,默认为 /metrics# scheme defaults to 'http'.static_configs: #静态目标配置,固定从某个target拉取数据- targets: ["localhost:9090"]
global
:全局配置,如数据采集间隔(scrape_interval: 15s
)、告警规则检查间隔(evaluation_interval: 15s
);alerting
:Alertmanager配置(默认未启用);rule_files
:告警规则文件路径(默认未配置);scrape_configs
:采集配置,默认仅监控Prometheus Server自身(job_name: "prometheus"
,目标地址localhost:9090
)。
5.2.2 配置系统服务(实现开机自启)
1、创建系统服务文件:
cat > /usr/lib/systemd/system/prometheus.service <<'EOF'
[Unit]
Description=Prometheus Server # 服务描述
Documentation=https://prometheus.io # 官方文档地址
After=network.target # 依赖网络服务[Service]
Type=simple
# 启动命令:指定配置文件、数据存储路径、数据保留时间、启用配置热重载
ExecStart=/usr/local/prometheus/prometheus \
--config.file=/usr/local/prometheus/prometheus.yml \
--storage.tsdb.path=/usr/local/prometheus/data/ \
--storage.tsdb.retention=15d \
--web.enable-lifecycle # 启用HTTP API热重载配置(无需重启服务)ExecReload=/bin/kill -HUP $MAINPID # 重载命令
Restart=on-failure # 服务故障时自动重启[Install]
WantedBy=multi-user.target # 多用户模式下生效
EOF
======================================================================================
cat > /usr/lib/systemd/system/prometheus.service <<'EOF'
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io
After=network.target[Service]
Type=simple
ExecStart=/usr/local/prometheus/prometheus \
--config.file=/usr/local/prometheus/prometheus.yml \
--storage.tsdb.path=/usr/local/prometheus/data/ \
--storage.tsdb.retention=15d \
--web.enable-lifecycleExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure[Install]
WantedBy=multi-user.target
EOF
2、启动并设置开机自启:
systemctl daemon-reload # 重新加载系统服务
systemctl start prometheus # 启动服务
systemctl enable prometheus # 开机自启
5.2.3 验证部署
1、检查服务状态与端口(Prometheus默认端口9090):
systemctl status prometheus # 查看服务是否运行正常
netstat -natp | grep :9090 # 查看9090端口是否监听
2、浏览器访问验证:
-
访问Prometheus Web UI:
http://<服务器IP>:9090
(如http://192.168.10.18:9090
); -
查看监控目标:点击页面顶部
Status
→Targets
,若prometheus
目标状态为UP
,说明自身监控正常;
-
查看指标数据:访问
http://<服务器IP>:9090/metrics
,可看到Prometheus采集的自身指标,其中 Help 字段用于解释当前指标的含义,Type 字段用于说明数据的类型(如prometheus_build_info
、prometheus_http_requests_total
)。
5.3 部署Exporter(监控第三方服务)
5.3.1 部署Node-Exporter(监控服务器资源)(所有节点执行
)
Node-Exporter用于采集服务器的CPU、内存、磁盘、网络等系统级指标,需部署到所有待监控的主机。
5.3.1.1 解压与安装
1、上传软件包到/opt
目录并解压(软件包可从Node-Exporter官网下载):
cd /opt
# 若未上传,可通过wget下载
# wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
tar xf node_exporter-1.3.1.linux-amd64.tar.gz
# 将二进制文件移动到系统PATH目录,便于直接调用
mv node_exporter-1.3.1.linux-amd64/node_exporter /usr/local/bin
5.3.1.2 配置系统服务
1、创建服务文件:
cat > /usr/lib/systemd/system/node_exporter.service <<'EOF'
[Unit]
Description=node_exporter # 服务描述
Documentation=https://prometheus.io/ # 官方文档
After=network.target # 依赖网络服务[Service]
Type=simple
# 启动命令:启用NTP、挂载状态、systemd服务状态、TCP连接状态采集
ExecStart=/usr/local/bin/node_exporter \
--collector.ntp \
--collector.mountstats \
--collector.systemd \
--collector.tcpstatExecReload=/bin/kill -HUP $MAINPID # 重载命令
Restart=on-failure # 故障自动重启[Install]
WantedBy=multi-user.target
EOF
======================================================================================
cat > /usr/lib/systemd/system/node_exporter.service <<'EOF'
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target[Service]
Type=simple
ExecStart=/usr/local/bin/node_exporter \
--collector.ntp \
--collector.mountstats \
--collector.systemd \
--collector.tcpstatExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure[Install]
WantedBy=multi-user.target
EOF
2、启动并设置开机自启:
systemctl daemon-reload
systemctl start node_exporter
systemctl enable node_exporter
5.3.1.3 验证与接入Prometheus
1、验证部署:
netstat -natp | grep :9100 # Node-Exporter默认端口9100
# 浏览器访问指标接口:http://<主机IP>:9100/metrics(如http://192.168.10.18:9100/metrics)
常用的各指标:
- node_cpu_seconds_total
- node_memory_MemTotal_bytes
- node_filesystem_size_bytes{mount_point=PATH}
- node_system_unit_state{name=}
- node_vmstat_pswpin:系统每秒从磁盘读到内存的字节数
- node_vmstat_pswpout:系统每秒钟从内存写到磁盘的字节数
更多指标介绍:https://github.com/prometheus/node_exporter
2、在Prometheus Server中添加Node-Exporter监控配置:
cp /usr/local/prometheus/prometheus.yml /usr/local/prometheus/prometheus.yml.bak
vim /usr/local/prometheus/prometheus.yml
# 在尾部增加如下内容(与默认的prometheus job同级)- job_name: "nodes" # 任务名,用于标识Node-Exporter监控metrics_path: "/metrics" # 指标采集路径(默认无需修改)static_configs:- targets: # 待监控的Node-Exporter地址列表(多个主机用逗号分隔)- 192.168.10.18:9100- 192.168.10.21:9100- 192.168.10.22:9100labels: # 自定义标签,便于后续筛选service: kubernetes
======================================================================================- job_name: nodesmetrics_path: "/metrics"static_configs:- targets:- 192.168.10.18:9100- 192.168.10.21:9100- 192.168.10.22:9100labels:service: kubernetes
3、热重载Prometheus配置(无需重启服务):
curl -X POST http://192.168.10.18:9090/-/reload # 若失败,可使用systemctl reload prometheus
4、验证监控目标:浏览器访问Prometheus Web UI → Status
→ Targets
,若nodes
任务下的目标状态均为UP
,说明Node-Exporter监控接入成功。
5.3.2 部署mysqld-exporter(监控MySQL数据库)
5.3.2.1 在MySQL服务器上操作
1、解压与安装mysqld-exporter:
# 上传 mysqld_exporter-0.14.0.linux-amd64.tar.gz 到 /opt 目录中
cd /opt
# 下载软件包(可从https://github.com/prometheus/mysqld_exporter/releases下载)
# wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.14.0/mysqld_exporter-0.14.0.linux-amd64.tar.gz
tar xf mysqld_exporter-0.14.0.linux-amd64.tar.gz
mv mysqld_exporter-0.14.0.linux-amd64/mysqld_exporter /usr/local/bin/
2、配置MySQL授权(mysqld-exporter需读取MySQL状态,需创建专用账号):
# 登录MySQL(替换为你的MySQL密码)
mysql -uroot -p123456
# 授权exporter用户(仅授予必要权限,保证安全)
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost' IDENTIFIED BY 'abc123';
FLUSH PRIVILEGES; # 刷新权限
exit;
3、配置MySQL连接信息:
vim /etc/my.cnf # 编辑MySQL配置文件
# 在[client]节点下添加以下内容(mysqld-exporter通过该配置连接MySQL)
[client]
host=localhost
user=exporter
password=abc123
4、创建mysqld-exporter系统服务:
cat > /usr/lib/systemd/system/mysqld_exporter.service <<'EOF'
[Unit]
Description=mysqld_exporter
Documentation=https://prometheus.io/
After=network.target[Service]
Type=simple
# 启动命令:指定MySQL配置文件
ExecStart=/usr/local/bin/mysqld_exporter --config.my-cnf=/etc/my.cnf
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure[Install]
WantedBy=multi-user.target
EOF
5、启动服务并验证:
systemctl restart mysqld # 重启MySQL使配置生效
systemctl start mysqld_exporter
systemctl enable mysqld_exporter
netstat -natp | grep :9104 # mysqld-exporter默认端口9104
5.3.2.2 在Prometheus Server上添加MySQL监控配置
1、修改Prometheus配置文件:
vim /usr/local/prometheus/prometheus.yml
# 在尾部增加如下内容- job_name: "mysqld"metrics_path: "/metrics"static_configs:- targets:- 192.168.10.21:9104 # MySQL服务器的mysqld-exporter地址labels:service: mysqld
2、热重载配置并验证:
curl -X POST http://192.168.10.18:9090/-/reload
或者
systemctl reload prometheus
# 浏览器查看Targets,确认mysqld任务目标状态为UP
5.3.3 部署nginx-exporter(监控Nginx服务)
需先为Nginx安装nginx-module-vts
模块(用于采集流量数据),再部署nginx-exporter。
- 下载 nginx-exporter 地址:https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.10.3/nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
- 下载 nginx 地址:http://nginx.org/download/
- 下载 nginx 插件地址:https://github.com/vozlt/nginx-module-vts/tags
5.3.3.1 在Nginx服务器上操作
1、安装依赖与准备软件包:
# 安装Nginx编译依赖
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
# 创建Nginx专用用户(无登录权限)
useradd -M -s /sbin/nologin nginx# 上传或者下载软件包(若未上传,可通过以下命令下载)
cd /opt
# 1. 下载nginx-module-vts模块(https://github.com/vozlt/nginx-module-vts/tags)
wget https://github.com/vozlt/nginx-module-vts/archive/refs/tags/v0.1.18.tar.gz -O nginx-module-vts-0.1.18.tar.gz
# 2. 下载Nginx(http://nginx.org/download/)
wget http://nginx.org/download/nginx-1.18.0.tar.gz
# 3. 下载nginx-exporter(https://github.com/hnlq715/nginx-vts-exporter/releases)
wget https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.10.3/nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
2、解压并编译安装Nginx(启用vts模块):
# 解压nginx-module-vts模块
tar xf nginx-module-vts-0.1.18.tar.gz
mv nginx-module-vts-0.1.18 /usr/local/nginx-module-vts# 解压并编译Nginx
tar xf nginx-1.18.0.tar.gz
cd nginx-1.18.0/
# 配置编译参数(启用vts模块、SSL模块、状态模块)
./configure --prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module \
--add-module=/usr/local/nginx-module-vts # 启用vts模块# 编译安装
make && make install
3、修改Nginx配置(启用vts监控):
# 修改前备份配置文件
cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak
vim /usr/local/nginx/conf/nginx.conf
# 在http节点下添加以下内容(启用vts全局统计)
http {vhost_traffic_status_zone; # 启用vts全局共享内存区域vhost_traffic_status_filter_by_host on; # 按server_name区分统计(多域名场景必备)...... # 保留原有配置# 添加专用监控server(仅允许Prometheus服务器访问)server {vhost_traffic_status off; # 该server自身不参与流量统计listen 8080; # 监控端口(自定义,避免与业务端口冲突)allow 127.0.0.1; # 允许本地访问allow 192.168.10.18; # 允许Prometheus服务器IP访问(替换为你的Prometheus IP)# Nginx基础状态监控location /nginx-status {stub_status on;access_log off; # 关闭访问日志,减少磁盘占用}# vts模块统计数据(供nginx-exporter采集)location /status {vhost_traffic_status_display; # 启用vts数据展示vhost_traffic_status_display_format html; # 支持HTML格式(便于浏览器查看)}}# 保留原有业务server配置server {listen 80;server_name localhost;......}
}
假如 nginx 没有规范配置 server_name 或者无需进行监控的 server 上,那么建议在此 vhost 上禁用统计监控功能。否则会出现 127.0.0.1、hostname 等的域名监控信息。
4、配置Nginx系统服务并启动:
# 创建Nginx服务文件
cat > /lib/systemd/system/nginx.service <<'EOF'
[Unit]
Description=nginx
After=network.target[Service]
Type=forking # Nginx为多进程模式,需指定Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid # 指定PID文件路径
ExecStart=/usr/local/nginx/sbin/nginx # 启动命令
ExecReload=/bin/kill -s HUP $MAINPID # 重载配置(平滑重启)
ExecStop=/bin/kill -s QUIT $MAINPID # 停止命令
PrivateTmp=true # 启用私有临时目录,增强安全性[Install]
WantedBy=multi-user.target
EOF
======================================================================================
cat > /lib/systemd/system/nginx.service <<'EOF'
[Unit]
Description=nginx
After=network.target[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true[Install]
WantedBy=multi-user.target
EOF
# 验证配置并启动
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ # 添加环境变量,便于直接调用nginx命令
nginx -t # 验证Nginx配置是否正确(显示ok与successful即为正常)
systemctl start nginx
systemctl enable nginx# 浏览器访问:http://192.168.10.22:8080/status,可以看到 Nginx Vhost Traffic Status 的页面信息
5、部署并启动nginx-exporter:
# 解压nginx-exporter
cd /opt
tar -zxvf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
mv nginx-vts-exporter-0.10.3.linux-amd64/nginx-vts-exporter /usr/local/bin/# 创建nginx-exporter服务文件
cat > /usr/lib/systemd/system/nginx-exporter.service <<'EOF'
[Unit]
Description=nginx-exporter
Documentation=https://prometheus.io/
After=network.target[Service]
Type=simple
# 启动命令:指定Nginx的vts数据接口地址
ExecStart=/usr/local/bin/nginx-vts-exporter -nginx.scrape_uri=http://localhost:8080/status/format/json
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure[Install]
WantedBy=multi-user.target
EOF# 启动服务并验证
systemctl start nginx-exporter
systemctl enable nginx-exporter
netstat -natp | grep :9913 # nginx-exporter默认端口9913
5.3.3.2 在Prometheus Server上添加Nginx监控配置
1、修改Prometheus配置文件:
vim /usr/local/prometheus/prometheus.yml
# 在尾部增加如下内容- job_name: "nginx"metrics_path: "/metrics"static_configs:- targets:- 192.168.10.22:9913 # Nginx服务器的nginx-exporter地址labels:service: nginx
2、热重载配置并验证:
curl -X POST http://192.168.10.18:9090/-/reload
# 浏览器查看Targets,确认nginx任务目标状态为UP
5.4 部署Grafana实现监控可视化
Grafana下载地址:
- https://grafana.com/grafana/download
- https://mirrors.bfsu.edu.cn/grafana/yum/rpm/
5.4.1 安装与启动Grafana(本文安装在监控中枢节点)
1、安装Grafana(以CentOS 7为例,使用yum安装):
# 配置Grafana yum源(若未配置)
cat > /etc/yum.repos.d/grafana.repo <<'EOF'
[grafana]
name=grafana
baseurl=https://packages.grafana.com/oss/rpm
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://packages.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
EOF# 安装Grafana 7.4.0(本文使用稳定版)
yum install -y grafana-7.4.0-1.x86_64.rpm
2、启动并设置开机自启:
systemctl start grafana-server
systemctl enable grafana-server
netstat -natp | grep :3000 # Grafana默认端口3000
5.4.2 配置Prometheus数据源
1、浏览器访问Grafana:http://<Grafana服务器IP>:3000
(本文Grafana与Prometheus部署在同一台主机,地址为http://192.168.10.18:3000
);
2、首次登录:默认账号/密码为admin/admin
,登录后需修改初始密码;
3、添加Prometheus数据源:
-
点击左侧菜单栏
Configuration
→Data Sources
→Add data source
;
-
在数据源列表中选择
Prometheus
;
-
在
HTTP
→URL
中输入Prometheus Server地址(如http://192.168.10.18:9090
);
-
其他配置保持默认,点击底部
Save & Test
,若显示Data source is working
,说明数据源配置成功。
4、点击 上方菜单 Dashboards,Import 所有默认模板,Dashboards -> Manage
,选择 Prometheus 2.0 Stats
或 Prometheus Stats
即可看到 Prometheus job 实例的监控图像
5.4.3 导入监控仪表盘
Grafana官方提供了大量现成的仪表盘模板(官方模板库),可直接导入使用:
1、导入Node-Exporter仪表盘(监控服务器资源):
-
访问官方模板库,搜索
Node Exporter
,选择下载量较高的模板(如模板ID:8171
,Kubernetes Nodes);
-
在Grafana页面点击左侧
+ Create
→Import
; -
输入模板ID(如
8171
),点击Load
; -
选择已配置的Prometheus数据源,点击
Import
; -
导入成功后,即可看到服务器的CPU、内存、磁盘、网络等指标的可视化图表。
2、导入MySQL/Nginx仪表盘:
-
MySQL模板:搜索
MySQL
,推荐模板ID:7362
(MySQL Overview);
-
Nginx模板:搜索
Nginx VTS
,推荐模板ID:2949
(Nginx VTS Stats);
-
导入步骤与Node-Exporter一致,导入后即可查看对应服务的监控仪表盘。
5.5 部署Prometheus服务发现
静态配置适用于监控目标固定的场景,若监控目标动态变化(如K8s集群中的Pod),需通过服务发现机制实现动态管理。
5.5.1 基于文件的服务发现
基于文件的服务发现是最简单的动态发现方式,通过定期读取YAML/JSON文件获取目标列表,适用于小规模集群。
1、在Prometheus Server上创建服务发现配置目录与文件:
cd /usr/local/prometheus
mkdir targets # 创建目标配置目录# 创建Node-Exporter的目标配置文件
vim targets/node-exporter.yaml
- targets:- 192.168.10.18:9100- 192.168.10.21:9100labels:app: node-exporterjob: node# 创建mysqld-exporter的目标配置文件
vim targets/mysqld-exporter.yaml
- targets:- 192.168.10.21:9104- 192.168.10.17:9104 # 新增的MySQL服务器labels:app: mysqld-exporterjob: mysqld
2、修改Prometheus配置文件,启用文件服务发现:
vim /usr/local/prometheus/prometheus.yml
# 修改原有的nodes和mysqld job配置,替换为文件发现
scrape_configs:# 原prometheus job保留- job_name: "prometheus"metrics_path: '/metrics'static_configs:- targets: ["localhost:9090"]
======================================================================================# Node-Exporter文件服务发现- job_name: "nodes"file_sd_configs: # 指定使用文件服务发现- files: # 配置文件路径(支持通配符)- targets/node*.yamlrefresh_interval: 2m # 每2分钟重新读取文件(默认5分钟)# mysqld-exporter文件服务发现- job_name: "mysqld"file_sd_configs:- files:- targets/mysqld*.yamlrefresh_interval: 2m
======================================================================================- job_name: "nodes"file_sd_configs:- files:- targets/node*.yamlrefresh_interval: 2m- job_name: "mysqld"file_sd_configs:- files:- targets/mysqld*.yamlrefresh_interval: 2m
3、热重载配置并验证:
curl -X POST http://192.168.10.18:9090/-/reload
或者
systemctl reload prometheus
# 浏览器查看 Prometheus 页面的 Status -> Targets
后续新增监控目标时,只需修改targets目录下的YAML文件,无需修改Prometheus主配置
5.5.2 基于Consul的服务发现
Consul是一款开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的功能。支持健康检查、多数据中心等功能,适用于中大规模集群。
Consul下载地址:https://www.consul.io/downloads/
5.5.2.1 部署Consul服务
1、在Consul服务器(本文与Prometheus同机)上安装Consul:
cd /opt
# 下载Consul(https://www.consul.io/downloads)
wget https://releases.hashicorp.com/consul/1.9.2/consul_1.9.2_linux_amd64.zip
unzip consul_1.9.2_linux_amd64.zip
mv consul /usr/local/bin/
2、创建Consul数据目录与配置目录:
mkdir /var/lib/consul-data # 数据存储目录
mkdir /etc/consul/ # 配置文件目录
3、使用 server 模式启动 Consul 服务:
consul agent \
-server \
-bootstrap \ # 表示自身为leader
-ui \ # 启用Web UI(默认端口8500)
-data-dir=/var/lib/consul-data \
-config-dir=/etc/consul/ \
-bind=192.168.10.18 \ # 绑定Consul服务IP(需与Prometheus通信)
-client=0.0.0.0 \ # 允许所有IP访问Consul
-node=consul-server01 &> /var/log/consul.log & # 后台运行并输出日志
======================================================================================
consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-config-dir=/etc/consul/ \
-bind=192.168.10.18 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &
4、验证Consul部署:
consul members # 查看Consul集群成员
# 浏览器访问Consul Web UI:http://192.168.10.18:8500
5.5.2.2 在Consul中注册监控服务
1、创建服务注册配置文件(以Node-Exporter为例):
vim /etc/consul/nodes.json
{"services": [{"id": "node_exporter-node01", # 服务唯一ID(不可重复)"name": "node01", # 服务名"address": "192.168.10.18", # 监控目标IP(Node-Exporter所在主机)"port": 9100, # 监控目标端口"tags": ["nodes"], # 标签(用于Prometheus筛选)"checks": [ # 健康检查(Consul定期探测,失败则标记服务不健康){"http": "http://192.168.10.18:9100/metrics","interval": "5s" # 每5秒检查一次}]},{"id": "node_exporter-node02","name": "node02","address": "192.168.10.21","port": 9100,"tags": ["nodes"],"checks": [{"http": "http://192.168.10.21:9100/metrics","interval": "5s"}]}]
}
======================================================================================
{"services": [{"id": "node_exporter-node01","name": "node01","address": "192.168.10.18","port": 9100,"tags": ["nodes"],"checks": [{"http": "http://192.168.10.18:9100/metrics","interval": "5s"}]},{"id": "node_exporter-node02","name": "node02","address": "192.168.10.21","port": 9100,"tags": ["nodes"],"checks": [{"http": "http://192.168.10.21:9100/metrics","interval": "5s"}]}]
}
2、重新加载Consul配置(注册服务):
consul reload # 无需重启Consul,直接重载配置
# 浏览器访问http://192.168.10.18:8500 Consul UI → Services,可看到注册的node01、node02服务
5.5.2.3 配置Prometheus对接Consul
1、修改Prometheus配置文件:
vim /usr/local/prometheus/prometheus.yml
# 在scrape_configs节点下添加以下内容(替换原有的nodes job文件发现配置)- job_name: "nodes"consul_sd_configs: # 指定使用Consul服务发现- server: 192.168.10.18:8500 # Consul服务地址tags: ["nodes"] # 仅发现带有nodes标签的服务refresh_interval: 2m # 每2分钟从Consul获取一次目标列表
======================================================================================- job_name: "nodes"consul_sd_configs:- server: 192.168.10.18:8500tags: ["nodes"]refresh_interval: 2m
2、热重载配置并验证:
curl -X POST http://192.168.10.18:9090/-/reload
# 浏览器查看Prometheus Targets,确认从Consul发现的目标状态为UP
3、Consul服务管理(可选):
# 注销服务(如注销node02)
consul services deregister -id="node_exporter-node02"
# 重新注册服务
consul services register /etc/consul/nodes.json
5.5.3 基于Kubernetes API的服务发现
适用于Kubernetes集群环境,Prometheus可直接对接K8s API Server,动态发现Node、Pod、Service等资源对象。
5.5.3.1 核心配置参数
Prometheus通过kubernetes_sd_configs
配置对接K8s,核心参数如下:
api_server
:K8s API Server地址(若Prometheus部署在K8s集群内,可省略,自动发现);role
:发现的资源类型,可选值:node
:发现K8s集群中的Node节点;pod
:发现K8s集群中的Pod;service
:发现K8s集群中的Service;endpoints
:发现K8s集群中的Endpoints;ingress
:发现K8s集群中的Ingress;
tls_config
:TLS认证配置(对接K8s API Server需认证,通常使用集群内的CA证书);namespaces
:指定发现的命名空间(默认所有命名空间)。
5.5.3.2 示例配置(发现K8s Node节点)
scrape_configs:- job_name: "k8s-nodes"kubernetes_sd_configs:- api_server: https://192.168.10.100:6443 # K8s API Server地址role: node # 发现Node资源tls_config:ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt # 集群内CA证书路径bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token # 集群内认证Token路径refresh_interval: 1m# 指标采集路径(K8s Node节点的指标通常由kubelet暴露在10250端口)metrics_path: /metrics/cadvisor
注:实际部署时,建议通过K8s的ConfigMap管理Prometheus配置,并使用ServiceAccount为Prometheus授权访问K8s API。
总结
本文从Prometheus的理论基础出发,详细讲解了其核心组件、工作原理与局限性,并通过完整的实战步骤,完成了Prometheus Server、Node-Exporter、mysqld-exporter、nginx-exporter及Grafana的部署与配置,同时覆盖了文件、Consul两种主流服务发现方式。
通过本文的操作,你已掌握了企业级监控系统的核心搭建能力:
1、可监控服务器、MySQL、Nginx等核心资源与服务;
2、能通过Grafana实现监控数据的可视化,快速识别指标异常;
3、可根据集群规模选择静态配置或动态服务发现,适配不同场景。
后续可进一步探索的方向:
- 配置Alertmanager实现告警分发(如钉钉、企业微信告警);
- 对接Thanos实现Prometheus高可用与长期数据存储;
- 自定义PromQL查询与监控仪表盘,满足业务个性化需求。
希望本文能为你的监控体系搭建提供实用参考,如有问题或优化建议,欢迎在评论区交流!
附录:常用资源链接
- Prometheus官网:https://prometheus.io
- Prometheus GitHub:https://github.com/prometheus
- Grafana官网:https://grafana.com
- Grafana仪表盘模板库:https://grafana.com/grafana/dashboards
- Consul官网:https://www.consul.io