
你的服务器是不是也这样CPU 使用率偶尔飙高内存占用悄悄增长磁盘空间不知不觉就满了但每次出问题都得靠用户反馈才知道或者你看着一堆命令行输出的数字却很难直观地看出系统的健康趋势很多开发者都卡在监控这一步。知道监控重要但 Prometheus 和 Grafana 这两个名字听起来就复杂官方文档又长又散从安装、配置到出图每一步都可能遇到各种环境问题最终“从入门到放弃”。这篇文章要解决的就是这个问题。我的核心判断是搭建一套可用的服务器监控面板核心流程其实非常标准化三天时间完全足够。关键在于绕过那些分散的、过时的教程直接抓住一条主线把安装、配置、数据采集和可视化串联起来。读完本文你将能独立完成从零搭建一套 Prometheus Grafana 监控系统并得到一个能实时反映服务器 CPU、内存、磁盘、网络等核心指标的可视化监控大盘。更重要的是你会理解这套组合的核心工作逻辑知道数据从哪里来、到哪里去、如何展示从而具备后续自定义监控和排查问题的能力。1. 为什么是 Prometheus Grafana它解决了什么根本问题在深入动手之前我们必须先搞清楚为什么是这两个工具的组合成为了云原生时代监控的事实标准。这能帮你理解每一步操作背后的意义而不是机械地复制命令。传统的服务器监控你可能用过top、free、df命令或者一些简单的脚本。但这些方式存在几个致命缺陷历史数据缺失只能看当前瞬间的状态无法回溯问题发生前的趋势。可视化困难一堆数字难以形成直观认知更别提给非技术人员看了。告警滞后往往等问题发生了才被动发现无法提前预警。难以聚合当服务器数量增多后分散的信息无法统一管理。Prometheus Grafana 的组合完美地解决了这些问题Prometheus负责“抓取”和“存储”指标数据。它定时从各个目标如你的服务器、数据库、应用拉取Pull指标并按照时间序列存储在本地。它的数据模型指标名标签非常灵活查询语言PromQL功能强大。Grafana负责“展示”和“告警”。它是一个功能强大的可视化平台可以从 Prometheus 等数据源读取数据绘制成各种精美的图表、仪表盘并配置灵活的告警规则。简单来说Prometheus 是数据库和采集器Grafana 是报表和报警系统。这个分工让两者各司其职都非常专业。对于个人开发者、中小团队或是想监控自己云服务器的用户来说这套方案的优势在于开源免费没有授权费用。生态强大几乎所有的现代软件如 MySQL, Redis, Nginx, Node.js, JVM都提供了 Prometheus 格式的指标接口。配置即代码所有配置都是文件易于版本管理和自动化。轻量级单个服务对资源消耗不大非常适合从一台服务器开始。接下来我们就用三天时间走通从安装到出图的完整流程。2. 环境准备与规划你的“三天计划”路线图在开始下载任何软件之前做好环境规划能避免后续很多混乱。我们假设一个最典型的场景你有一台安装了 Linux 的服务器可以是云服务器如阿里云 ECS、腾讯云 CVM也可以是本地虚拟机想监控这台服务器本身。Day 1 目标完成 Prometheus 和 Node Exporter 的安装与基础配置让数据采集跑起来。Day 2 目标完成 Grafana 的安装并接入 Prometheus 数据源看到最基础的图表。Day 3 目标导入成熟的服务器监控仪表盘配置核心告警形成完整可用的监控面板。前置条件一台 Linux 服务器本文以CentOS 7.x / Rocky Linux 8.x 或 Ubuntu 20.04/22.04 LTS为例大部分命令通用。你需要拥有sudo权限。网络连通服务器需要能访问互联网以下载安装包。基础命令行操作熟悉cd,ls,wget,tar,systemctl,vim/nano等命令。防火墙/安全组需要开放相关端口供访问后续会说明。软件版本说明请以实际最新稳定版为准Prometheus: 最新稳定版如 2.45.0Node Exporter: 最新稳定版如 1.6.0Grafana: 最新稳定版如 10.0.0我们将把所有软件安装在/opt目录下并使用systemd来管理服务这是生产环境推荐的做法。3. Day 1安装 Prometheus 与 Node Exporter启动数据采集今天的目标是让 Prometheus 运行起来并配置它去采集我们服务器的硬件和系统指标这需要一个叫node_exporter的组件。3.1 安装 Node Exporter指标暴露器Node Exporter 是 Prometheus 官方提供的采集主机指标如 CPU、内存、磁盘、网络的代理。它运行在需要被监控的服务器上暴露一个 HTTP 接口Prometheus 会从这个接口拉取数据。# 1. 创建专用用户为了安全不建议用root运行 sudo useradd --no-create-home --shell /bin/false node_exporter # 2. 下载并解压 Node Exporter # 进入临时目录下载最新版本请访问 https://prometheus.io/download/ 查看最新版本号 cd /tmp wget https://github.com/prometheus/node_exporter/releases/download/v1.6.0/node_exporter-1.6.0.linux-amd64.tar.gz tar -xzf node_exporter-1.6.0.linux-amd64.tar.gz # 3. 移动二进制文件到系统目录并设置权限 sudo mv node_exporter-1.6.0.linux-amd64/node_exporter /usr/local/bin/ sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter # 4. 创建 systemd 服务文件 sudo vim /etc/systemd/system/node_exporter.service将以下内容写入/etc/systemd/system/node_exporter.service文件[Unit] DescriptionNode Exporter Wantsnetwork-online.target Afternetwork-online.target [Service] Usernode_exporter Groupnode_exporter Typesimple ExecStart/usr/local/bin/node_exporter [Install] WantedBymulti-user.target# 5. 启动 Node Exporter 并设置开机自启 sudo systemctl daemon-reload sudo systemctl start node_exporter sudo systemctl enable node_exporter # 6. 检查服务状态和端口 sudo systemctl status node_exporter # 应该看到 active (running) 状态 curl http://localhost:9100/metrics # 如果看到大量以 node_ 开头的文本指标输出说明安装成功关键点解释Node Exporter 默认监听在9100端口。访问http://你的服务器IP:9100/metrics可以看到它暴露的所有指标这是 Prometheus 抓取数据的源头。使用systemd管理服务可以保证进程意外退出后自动重启并且方便地启停。3.2 安装与配置 Prometheus监控服务器Prometheus 是主服务器它需要被安装在一台独立的机器上在我们的单机场景下就和 Node Exporter 装在同一台。# 1. 创建专用用户 sudo useradd --no-create-home --shell /bin/false prometheus # 2. 创建配置和数据目录 sudo mkdir /etc/prometheus sudo mkdir /var/lib/prometheus sudo chown prometheus:prometheus /etc/prometheus sudo chown prometheus:prometheus /var/lib/prometheus # 3. 下载并解压 Prometheus cd /tmp wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz tar -xzf prometheus-2.45.0.linux-amd64.tar.gz # 4. 移动二进制文件和配置文件 sudo mv prometheus-2.45.0.linux-amd64/prometheus /usr/local/bin/ sudo mv prometheus-2.45.0.linux-amd64/promtool /usr/local/bin/ sudo chown prometheus:prometheus /usr/local/bin/prometheus sudo chown prometheus:prometheus /usr/local/bin/promtool sudo mv prometheus-2.45.0.linux-amd64/consoles /etc/prometheus/ sudo mv prometheus-2.45.0.linux-amd64/console_libraries /etc/prometheus/ sudo chown -R prometheus:prometheus /etc/prometheus # 5. 创建 Prometheus 主配置文件 sudo vim /etc/prometheus/prometheus.yml这是 Prometheus 最核心的配置文件它定义了抓取规则。将以下内容写入/etc/prometheus/prometheus.yml# 全局配置 global: scrape_interval: 15s # 每15秒抓取一次数据 evaluation_interval: 15s # 每15秒评估一次告警规则 # 告警规则文件配置暂时不用后续可添加 rule_files: # - first_rules.yml # - second_rules.yml # 抓取配置这里定义要监控的目标 scrape_configs: # 任务名监控 Prometheus 自身 - job_name: prometheus static_configs: - targets: [localhost:9090] # Prometheus 自己暴露指标的端口 # 任务名监控 Linux 服务器节点 - job_name: node static_configs: - targets: [localhost:9100] # Node Exporter 的地址和端口 labels: instance: my-first-server # 给这个目标打上一个标签便于识别# 6. 设置配置文件权限 sudo chown prometheus:prometheus /etc/prometheus/prometheus.yml # 7. 创建 systemd 服务文件 sudo vim /etc/systemd/system/prometheus.service将以下内容写入/etc/systemd/system/prometheus.service[Unit] DescriptionPrometheus Wantsnetwork-online.target Afternetwork-online.target [Service] Userprometheus Groupprometheus Typesimple 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 \ --web.listen-address0.0.0.0:9090 [Install] WantedBymulti-user.target# 8. 启动 Prometheus 并设置开机自启 sudo systemctl daemon-reload sudo systemctl start prometheus sudo systemctl enable prometheus # 9. 检查服务状态 sudo systemctl status prometheus3.3 验证 Day 1 成果检查服务端口sudo netstat -tlnp | grep -E (9090|9100)应该看到9090(Prometheus) 和9100(Node Exporter) 端口都在监听。访问 Prometheus Web UI 在浏览器中打开http://你的服务器IP:9090。点击页面上方的“Status” - “Targets”。你应该看到两个目标prometheus和node状态都应为“UP”。这证明 Prometheus 正在成功抓取自身和 Node Exporter 的数据。点击“Graph”页签在输入框中尝试输入一个 PromQL 查询例如node_memory_MemTotal_bytes然后点击“Execute”。如果能看到图表或数据表格说明数据流已经完全打通第一天总结你已经成功部署了监控系统的数据采集和存储层。Prometheus 在后台默默地每15秒抓一次数据并存储在本地时序数据库中。现在数据已经有了缺的是一个好看的“脸面”。4. Day 2安装 Grafana连接数据源绘制第一张图Grafana 是我们的可视化利器。今天的目标是安装它并连接到 Prometheus创建第一个图表。4.1 安装 Grafana这里我们使用 Grafana 官方提供的仓库进行安装方便后续升级。对于 CentOS/RHEL/Rocky Linux# 1. 添加 Grafana 仓库 sudo vim /etc/yum.repos.d/grafana.repo写入以下内容[grafana] namegrafana baseurlhttps://packages.grafana.com/oss/rpm repo_gpgcheck1 enabled1 gpgcheck1 gpgkeyhttps://packages.grafana.com/gpg.key sslverify1 sslcacert/etc/pki/tls/certs/ca-bundle.crt# 2. 安装 Grafana sudo yum install -y grafana对于 Ubuntu/Debian# 1. 安装依赖和添加 GPG 密钥 sudo apt-get install -y software-properties-common wget sudo wget -q -O /usr/share/keyrings/grafana.key https://packages.grafana.com/gpg.key # 2. 添加稳定版仓库 echo deb [signed-by/usr/share/keyrings/grafana.key] https://packages.grafana.com/oss/deb stable main | sudo tee -a /etc/apt/sources.list.d/grafana.list # 3. 更新并安装 sudo apt-get update sudo apt-get install -y grafana4.2 启动并配置 Grafana# 启动 Grafana 服务并设置开机自启 sudo systemctl daemon-reload sudo systemctl start grafana-server sudo systemctl enable grafana-server # 检查服务状态 sudo systemctl status grafana-serverGrafana 默认监听在3000端口。4.3 登录并添加 Prometheus 数据源登录 Grafana浏览器打开http://你的服务器IP:3000。默认用户名和密码都是admin。首次登录会要求修改密码请务必修改并牢记。添加数据源登录后点击左侧导航栏的齿轮图标 (Configuration)-“Data Sources”。点击“Add data source”。选择“Prometheus”。在“HTTP”部分的“URL”中填写http://localhost:9090因为 Grafana 和 Prometheus 装在同一台服务器。如果不在同一台则填写 Prometheus 服务器的实际地址和端口。其他选项保持默认滚动到页面底部点击“Save test”。如果看到绿色的“Data source is working”提示恭喜你数据源配置成功4.4 创建第一个仪表盘和面板现在我们来手动创建一个显示 CPU 使用率的图表理解 Grafana 的工作方式。创建仪表盘点击左侧“田字格图标 (Dashboards)”-“New”-“New dashboard”。添加面板在新仪表盘页面点击“Add visualization”。选择数据源在查询编辑器上方确保数据源是你刚添加的Prometheus。编写 PromQL 查询在查询编辑器通常标记为A中输入以下 PromQL 查询来计算 CPU 使用率100 - (avg by (instance) (rate(node_cpu_seconds_total{modeidle}[1m])) * 100)这个查询的含义是计算过去1分钟内非空闲idle状态的CPU时间占比从而得到使用率。node_cpu_seconds_total是 Node Exporter 提供的指标modeidle筛选出空闲状态的CPU时间rate函数计算每秒的增长率avg by (instance)按实例服务器聚合。配置图表在右侧的“Visualization”下拉菜单中选择“Time series”时间序列图。在“Panel options”中给面板起个名字比如 “CPU Usage”。在“Standard options”里可以设置单位Unit为Percent (0-100)。应用并保存点击右上角的“Apply”保存这个面板。然后点击仪表盘顶部的“Save dashboard”图标给你的仪表盘起个名字如 “My Server Monitor”并保存。至此你已经完成了从数据采集到可视化的完整链路虽然只有一个图但你已经掌握了最核心的操作配置数据源 - 编写 PromQL - 选择可视化类型。5. Day 3导入专业仪表盘与配置基础告警手动创建所有图表效率太低。Grafana 社区有大量制作精良、开箱即用的仪表盘模板。今天我们通过“导入”功能快速获得一个全面的服务器监控视图并配置一个简单的告警。5.1 导入 Node Exporter 全览仪表盘Grafana 官网有一个官方维护的、非常全面的 Node Exporter 仪表盘。获取仪表盘 ID访问 Grafana Dashboards 官网 搜索 “Node Exporter Full”。通常第一个结果 ID 是1860请以网站最新为准。在 Grafana 中导入回到你的 Grafana 界面点击左侧“田字格图标”-“New”-“Import”。在“Import via grafana.com”输入框中填入仪表盘 ID1860然后点击“Load”。在下一个页面选择你的 Prometheus 数据源然后点击“Import”。查看成果导入成功后你会立即看到一个包含数十个图表的专业监控面板里面涵盖了 CPU、内存、磁盘 IO、网络流量、系统负载、磁盘空间等几乎所有关键指标。花点时间浏览一下你会对服务器的状态一目了然。5.2 配置一个磁盘空间不足的告警可视化是为了看告警是为了“被通知”。我们配置一个当根目录磁盘使用率超过 80% 时触发告警的规则。在 Prometheus 中配置告警规则文件可选但推荐 Prometheus 本身可以计算告警条件但更常见的做法是使用其姐妹项目Alertmanager来管理告警路由和通知如发邮件、钉钉、Slack。为了简化我们先在 Grafana 中配置内置告警。在 Grafana 面板上配置告警打开你刚刚导入的 “Node Exporter Full” 仪表盘。找到显示“Disk Space Usage”磁盘空间使用率的面板。将鼠标悬停在面板标题上点击出现的“下拉菜单图标”-“Edit”。进入面板编辑模式后点击右侧的“Alert”选项卡 -“Create alert”。配置告警规则Rule name:Disk Usage High on {{ $labels.instance }}Evaluate every:1m(每1分钟评估一次)For:2m(持续2分钟满足条件才触发避免抖动)配置条件在查询部分应该已经有一个查询比如100 - (node_filesystem_free_bytes{fstype!~”tmpfs|devtmpfs”} / node_filesystem_size_bytes{fstype!~”tmpfs|devtmpfs”} * 100)。确保它查询的是根分区通常mountpoint”/”。在“Conditions”部分设置WHENlast()OFquery(A, 1m, now)IS ABOVE80。意思是当查询 A 在过去1分钟内的最后一个值高于 80时触发告警。配置通知点击“Notifications”部分你需要先配置一个“通知渠道”Contact point。点击“Create contact point”。这里以“测试”为例选择类型为Test它只会在 Grafana 内部生成警报日志不会真正发送。你也可以后续配置邮件、钉钉等。保存联系点后在告警规则中选择它。保存点击右上角的“Save”保存面板然后保存仪表盘。测试告警告警规则保存后Grafana 会开始评估。你可以点击左侧“铃铛图标 (Alerting)”-“Alert rules”查看你创建的规则及其状态。当磁盘使用率真的超过80%并持续2分钟后状态会变为“Firing”。你可以在“Alerting”-“Alert instances”中看到触发的告警。5.3 可选开放防火墙端口供外部访问目前服务只能通过服务器本地访问。如果你想在外部浏览器访问 Grafana 面板需要开放端口。重要安全提醒生产环境务必为 Grafana 配置强密码并考虑使用 Nginx 反向代理添加 HTTPS 和身份认证。# 对于 firewalld (CentOS/Rocky) sudo firewall-cmd --permanent --add-port3000/tcp # Grafana sudo firewall-cmd --permanent --add-port9090/tcp # Prometheus (通常不建议直接暴露) sudo firewall-cmd --reload # 对于 ufw (Ubuntu) sudo ufw allow 3000/tcp # Grafana # sudo ufw allow 9090/tcp # 谨慎开放 Prometheus 端口 sudo ufw reload现在你可以通过http://你的服务器公网IP:3000在任何地方访问你的监控面板了。6. 核心概念与 PromQL 快速入门经过三天的实践系统已经跑起来了。但要真正驾驭它你需要理解几个核心概念和 PromQL 基础。6.1 核心概念指标 (Metric)一个随时间变化的测量值如node_cpu_seconds_total。它有一个名称和一组键值对标签Label。标签 (Label)指标的维度用于区分和筛选。例如{job”node”, instance”my-first-server”, mode”idle”}。标签让查询变得极其灵活。时间序列 (Time Series)一个指标在连续时间点上的值序列。由指标名一组唯一的标签组合定义。抓取 (Scrape)Prometheus 定期从目标 HTTP 端点拉取指标数据的过程。PromQLPrometheus 查询语言用于从时序数据库中检索和聚合数据。它是生成图表和告警的基础。6.2 常用 PromQL 示例理解这些查询你就能自定义大部分监控视图CPU 总使用率如前所述100 - (avg by (instance) (rate(node_cpu_seconds_total{modeidle}[1m])) * 100)可用内存百分比node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100磁盘使用率根分区100 - (node_filesystem_free_bytes{mountpoint/} / node_filesystem_size_bytes{mountpoint/} * 100)网络接收流量速率eth0网卡rate(node_network_receive_bytes_total{deviceeth0}[1m])系统负载1分钟平均node_load1关键函数rate(): 计算时间范围内指标的平均增长速率适用于计数器只增不减的指标。increase(): 计算时间范围内的绝对增长量。sum(): 求和。avg(): 求平均值。by ()/without (): 在聚合时指定分组或排除的标签。7. 常见问题与排查思路在部署和使用过程中你可能会遇到以下问题问题现象可能原因排查方式解决方案Prometheus Targets 状态为DOWN1. 网络不通/端口未监听2. 防火墙/安全组阻止3. 目标服务未运行1. 在 Prometheus 服务器上curl -v http://目标IP:端口/metrics2.sudo systemctl status 服务名3.sudo netstat -tlnp | grep 端口1. 检查服务状态并启动2. 配置防火墙规则3. 检查prometheus.yml中targets地址是否正确Grafana 中查询不到数据1. 数据源配置错误2. PromQL 写错3. 时间范围设置不对1. 在 Grafana 数据源配置页点击“Save test”2. 去 Prometheus Web UI (http://IP:9090) 的 “Graph” 页测试相同查询3. 检查 Grafana 右上角的时间范围1. 修正数据源 URL2. 在 Prometheus UI 中调试 PromQL3. 调整时间范围为最近几小时Node Exporter 指标不全如缺少磁盘1. 权限不足无法读取某些系统信息2. 内核版本或文件系统特殊1. 查看 Node Exporter 日志sudo journalctl -u node_exporter -f2. 检查/proc、/sys文件系统1. 确保以root或具有足够权限的用户运行不推荐生产环境用root可配置CAP_DAC_READ_SEARCH能力2. 启动时添加参数收集特定指标如--collector.filesystem.ignored-mount-points磁盘空间报警不准确1. 查询条件未过滤临时文件系统tmpfs2. 监控了非关键分区在 Prometheus UI 中查询node_filesystem_size_bytes和node_filesystem_free_bytes查看所有挂载点在 PromQL 中添加过滤器如fstype!~”tmpfs|devtmpfs”服务启动失败1. 配置文件语法错误YAML格式敏感2. 目录权限错误3. 端口被占用1.sudo journalctl -u prometheus -xe查看详细错误日志2.promtool check config /etc/prometheus/prometheus.yml检查配置文件3.sudo lsof -i:9090查看端口占用1. 根据日志修正配置或权限2. 使用promtool验证配置3. 停止占用端口的进程或修改服务监听端口8. 生产环境最佳实践与进阶方向当你把监控用于更严肃的环境时需要考虑以下几点安全加固Grafana强制修改默认密码配置强密码策略。通过 Nginx/Apache 设置反向代理启用 HTTPS。利用 Grafana 的[auth.proxy]或 OAuth 集成公司统一登录。Prometheus避免将9090端口直接暴露到公网。使用反向代理并配置基础认证。考虑使用--web.external-url参数。Node Exporter使用非 root 用户运行。通过--collector参数禁用不需要的采集器如--collector.textfile如果不用的话减少攻击面。数据持久化与备份Prometheus 数据默认存储在--storage.tsdb.path指定的目录。确保该目录所在磁盘空间充足一般保留至少15-30天的数据。考虑使用远程存储如 Thanos, Cortex, M3DB来实现长期存储、高可用和全局视图。定期备份prometheus.yml等配置文件。监控更多目标数据库MySQL (mysqld_exporter)、Redis (redis_exporter)。Web服务器Nginx (nginx-prometheus-exporter)。应用任何支持暴露 Prometheus 格式指标的应用如 Spring Boot Actuator, Go 的promhttp包。方法在prometheus.yml的scrape_configs下添加新的job指向对应 exporter 的地址。告警管理升级部署Alertmanager用于对 Prometheus 产生的告警进行去重、分组、静默并路由到不同的接收器邮件、钉钉、企业微信、PagerDuty等。定义有意义的告警标签和注解方便识别和处理。使用服务发现在动态环境如 Kubernetes中手动维护targets列表不可行。Prometheus 支持多种服务发现机制DNS, Consul, Kubernetes API 等可以自动发现监控目标。三天时间你从零搭建了一套专业的服务器监控系统。这套系统的价值不在于它本身有多复杂而在于它为你打开了一扇门一扇通往可观测性、数据驱动决策和主动运维的大门。接下来你可以尝试监控你的下一个应用或者探索 Grafana 更强大的图表和告警功能。监控的世界很大但第一步你已经稳稳地迈出去了。