node exporter必须以非root用户运行,需用setcap授权或改用非特权端口(如9101)解决9100端口绑定权限问题;二进制应放至/usr/local/bin/或/opt/prometheus/;systemd中须设user、--web.listen-address=:9100、execstartpre=setcap、restart=on-failure;targets须写被监控机真实ip而非localhost;需验证metrics可访问且selinux放行。

Node Exporter 必须以非 root 用户权限运行,但默认监听端口 9100 需要特权 —— 所以要么用 setcap 授权,要么改用非特权端口(如 9101),否则 systemd 启动后立即退出或报 bind: permission denied。
node_exporter 二进制安装与路径规范
别直接扔进 /usr/local/soft/ 这类随意目录,Prometheus 生态工具推荐统一归到 /usr/local/bin/ 或 /opt/prometheus/ 下。实操建议:
- 下载后解压,只取
node_exporter二进制文件(不是整个目录):tar -xzf node_exporter-1.6.1.linux-amd64.tar.gz && sudo cp node_exporter-1.6.1.linux-amd64/node_exporter /usr/local/bin/ - 验证可执行:
sudo -u nobody /usr/local/bin/node_exporter --version(能输出版本即说明无依赖缺失) - 不要用
&后台运行,这无法被 systemd 管理,重启后服务就丢了
systemd 服务配置的关键字段
写 /etc/systemd/system/node_exporter.service 时,这几个字段不能错:
-
User建议设为nobody或新建的专用用户(如prometheus),避免 root 权限滥用 -
ExecStart必须带--web.listen-address=:9100,否则它默认只监听127.0.0.1:9100,外部 Prometheus 拉不到数据 - 如果坚持用 9100 端口又不想开 root,加这一行:
ExecStartPre=/usr/bin/setcap 'cap_net_bind_service=+ep' /usr/local/bin/node_exporter -
Restart=on-failure要有,不然进程崩溃后不会自动拉起
prometheus.yml 中 targets 的写法陷阱
很多人在 prometheus.yml 里写 targets: ["localhost:9100"],结果只能监控本机 —— 这是典型误解。实际要监控哪台机器,targets 就写它的 IP + 端口:
- 被监控机 IP 是
192.168.5.22,且已放行 9100 端口、关闭防火墙或配置了对应规则,那就写:- targets: ["192.168.5.22:9100"] - 多个节点别硬编码,改用
file_sd_configs动态加载,否则每次增删机器都要 reload Prometheus - 检查
scrape_timeout:默认是 10s,如果网络延迟高或目标机负载大,可能超时导致DOWN,可临时调成15s
验证 metrics 是否真正暴露成功
别只看 systemctl status node_exporter 显示 active,关键要看指标是否可访问:
- 在被监控机本地执行:
curl -s http://localhost:9100/metrics | head -n 5,应返回类似# HELP go_gc_duration_seconds ...的文本 - 从 Prometheus 所在机器执行:
curl -s http://192.168.5.22:9100/metrics | wc -l,若返回 0 行,说明网络不通或端口未开放 - 在 Prometheus Web UI 的
http://<prom-ip>:9090/targets</prom-ip>页面,状态必须是UP,且Last Scrape时间是秒级更新的
最容易被忽略的是 SELinux —— 即使关了 firewalld,CentOS/RHEL 8+ 默认启用 SELinux,会拦截 node_exporter 的网络 bind 行为,错误日志在 journalctl -u node_exporter -n 20 里常出现 Permission denied,此时要执行:sudo setsebool -P prometheus_can_network_connect 1。











