Prometheus在Linux上需满足运行身份、存储路径权限、配置加载和网络可达四条件才能正常工作;漏任一将导致静默退出或无法抓取数据。

Prometheus 在 Linux 上不是“下载解压就完事”的工具,它必须满足运行身份、存储路径权限、配置加载和网络可达这四个硬性条件才能真正工作;漏掉任意一个,服务大概率静默退出或抓不到数据。
怎么快速验证 Prometheus 能不能跑起来
别急着配 systemd 或改权限,先用最简方式确认核心功能可用:
- 用
wget下载最新版二进制包(比如v2.47.2):wget https://github.com/prometheus/prometheus/releases/download/v2.47.2/prometheus-2.47.2.linux-amd64.tar.gz - 解压后直接进目录:
tar -xzf prometheus-*.tar.gz && cd prometheus-*/ - 默认
prometheus.yml已含本地监控示例,无需修改 - 前台启动:
./prometheus --config.file=prometheus.yml --web.listen-address=":9090" - 浏览器打开
http://localhost:9090,点 Status → Targets,状态为 UP 才算真正拉取成功
这一步卡住,90% 是:netstat -tunlp | grep :9090 发现端口被占;./promtool check config prometheus.yml 报缩进错误;或当前用户没权限读 prometheus.yml(常见于文件放在 /root/ 下却用普通用户执行)。
systemd 服务里为什么总报 permission denied
现象是 systemctl status prometheus 显示 failed,但手动执行命令却正常——根本原因在 systemd 的执行上下文和权限隔离:
-
ExecStart=中的路径必须是绝对路径,例如/usr/local/prometheus/prometheus,不能只写prometheus -
User=和Group=必须设为非 root 用户(如prometheus),且该用户必须对prometheus.yml和--storage.tsdb.path指定的目录都有读写权限 -
WorkingDirectory=必须显式设置(比如/usr/local/prometheus),否则storage.tsdb.path=data/这类相对路径会指向根目录或 systemd 默认工作区,导致写入失败 - 所有文件(二进制、配置、data 目录)必须统一放在系统级路径下,例如
/usr/local/prometheus/,不能混在用户家目录或/root/
检查命令:sudo -u prometheus ls -l /usr/local/prometheus/prometheus.yml 和 sudo -u prometheus ls -ld /usr/local/prometheus/data,两者都得显示可读可写。
scrape_configs 里 targets 写 localhost:9100 为什么抓不到数据
这是新手踩坑率最高的配置错误:Prometheus 解析 localhost 是以它自身所在机器为视角的,不是以你编辑配置时的脑内地图为准。
- 如果 Prometheus 和 Node Exporter 在同一台机器,且 Node Exporter 监听的是
0.0.0.0:9100(而非默认的127.0.0.1:9100),那么targets: ["localhost:9100"]才有效 - 如果 Node Exporter 跑在另一台机器(比如
192.168.1.22),targets必须写成["192.168.1.22:9100"],不能省略端口,也不能靠 DNS 隐式补全 - 目标机器防火墙必须放行对应端口:
ufw allow 9100或firewall-cmd --add-port=9100/tcp --permanent - 在 Prometheus 所在机器上手动测试连通性:
curl -v http://192.168.1.22:9100/metrics,能返回指标文本才是真通
配置里任何 targets 字符串都必须是完整地址:协议隐含为 HTTP,但 IP/域名 + 端口缺一不可;写成 ["node-exporter"] 或 ["192.168.1.10"] 必然失败。
启动失败时该看哪条日志才有效
systemctl status prometheus 只给一行摘要,真正有用的错误全在 journal 日志里:
- 立刻执行:
sudo journalctl -u prometheus -n 50 -f,实时跟踪最后 50 行并持续输出新日志 - 常见关键错误信息包括:
open /path/to/prometheus.yml: no such file(路径错或权限不足)、permission denied on data directory(storage.tsdb.path目录无写权限)、error parsing YAML(缩进或字段名拼错)、server returned HTTP status 403 Forbidden(target 地址可访问但 exporter 拒绝请求) - 如果日志里完全没报错但服务几秒后就退出,基本可以断定是
--storage.tsdb.path权限问题或User=设置与目录归属不一致
复杂点在于:同一个错误可能在不同阶段暴露不同症状。比如 targets 写错,前期是 Status → Targets 显示 DOWN,后期可能因重试风暴拖垮 Prometheus 自身内存;所以得从日志源头定位,而不是只盯着 Web 界面状态。


















