Prometheus在Linux上需明确运行身份、存储路径、配置加载及网络可达性才能稳定工作;必须确保prometheus.yml可读、--storage.tsdb.path目录存在且有写权限、--web.listen-address端口未被占用。

root 启动或忽略 storage.tsdb.path 权限,90% 会导致启动失败或数据丢失。
用二进制包启动前必须确认的三件事
这是最轻量也最容易出错的方式,适合验证或测试环境:
-
prometheus.yml文件路径必须绝对正确,且prometheus进程有读权限(常见错误:permission denied或open /path/to/prometheus.yml: no such file) - 如果指定了
--storage.tsdb.path(比如/usr/local/prometheus/data),该目录必须存在,且运行用户(非root)拥有写权限;否则启动后几秒内会静默退出,journalctl -u prometheus里能看到permission denied on data directory -
--web.listen-address默认是:9090,但若端口被占用(如已有 Grafana 或其他服务),需显式换端口,否则报错address already in use
systemd 服务中 User 和 Group 必须是非 root
生产环境必须用普通用户运行,否则 storage.tsdb.path 目录权限、日志归属、安全策略都会出问题:
- 先创建专用用户:
sudo useradd --no-create-home --shell /bin/false prometheus - 确保
/usr/local/prometheus/data所有者是prometheus:prometheus(不能只改 owner 不改 group) - service 文件里的
ExecStart必须带完整路径,比如/usr/local/prometheus/prometheus,不能只写prometheus(否则 systemd 找不到命令) - 启动失败时别只看
systemctl status prometheus,要搭配sudo journalctl -u prometheus -n 50 -f看实时日志,很多错误(如配置语法错、target 地址不可达)只在日志里输出
配置文件里 targets 写 localhost 很可能监控不到远程主机
Node Exporter 跑在被监控机上,Prometheus 跑在服务端 —— 这两者不在同一台机器时,targets: ['localhost:9100'] 就是错的:
- 把
localhost换成被监控机的真实 IP,例如['192.168.1.22:9100'] - 确保 Prometheus 服务器能
curl http://192.168.1.22:9100/metrics成功(防火墙、SELinux、node_exporter 是否监听0.0.0.0:9100而非仅127.0.0.1:9100都要检查) - 如果用了 relabel_configs 过滤指标(比如只留
process_.*),注意 regex 是完整匹配整个指标名,不是子串;写成process_start_time_seconds就不会命中process_cpu_seconds_total
Docker 启动时挂载配置容易漏掉 :ro 权限
用 docker run 或 docker-compose 启动时,配置文件挂载不加只读标记,容器内进程可能意外覆盖或删掉宿主机的 prometheus.yml:
- 正确写法:
-v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml:ro - 忘记
:ro导致容器重启后配置消失,或者 Prometheus 自动重载时因文件被修改而 panic - 镜像默认使用
prometheus用户(UID 65534),若宿主机配置文件属主是root,需确保该 UID 有读权限,否则容器日志报permission denied,不是配置语法问题
prometheus 进程没权限写 data 目录、targets 地址写成本地却想监控远端、或者配置文件挂载后容器内读不了 —— 这些问题都不会在控制台直接报红字,得盯日志、试 curl、查权限。


















