Prometheus and node_exporter setup guide
15 min read - May 29, 2026

Install Prometheus and node_exporter, configure scrape targets, set up systemd services and secure your monitoring stack. Step-by-step for Linux.
Prometheus and node_exporter server monitoring setup
Prometheus scrapes and stores time-series metrics. node_exporter exposes system-level data like CPU, memory and disk usage for Prometheus to collect. This guide covers installing both, configuring scrape targets, running node_exporter as a systemd service and locking down access.
Installing node_exporter
Download the latest stable release from the official GitHub releases page. As of May 2026, that's version 1.11.1. Replace amd64 with arm64 if needed.
wget https://github.com/prometheus/node_exporter/releases/download/v1.11.1/node_exporter-1.11.1.linux-amd64.tar.gz
Verify the SHA256 checksum against the value on the releases page, then extract and install:
tar -xzvf node_exporter-1.11.1.linux-amd64.tar.gz
sudo mv node_exporter-1.11.1.linux-amd64/node_exporter /usr/local/bin/
Create a dedicated system user with no home directory and no login shell:
sudo useradd --no-create-home --shell /bin/false node_exporter
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter
Test it by running /usr/local/bin/node_exporter directly, then check the output:
curl http://localhost:9100/metrics
You should see lines prefixed with node_, including metrics like node_cpu_seconds_total and node_memory_MemAvailable_bytes. By default, node_exporter exposes around 500 time series.
Running node_exporter as a systemd service
Running node_exporter from the terminal is fine for testing, but it stops when you close the session. Create a unit file at /etc/systemd/system/node_exporter.service:
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
Restart=on-failure
RestartSec=5
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.target
Enable and start the service:
sudo systemctl daemon-reload
sudo systemctl enable node_exporter
sudo systemctl start node_exporter
Confirm it's running with sudo systemctl status node_exporter. The output should show active (running).
If Prometheus runs on the same host, bind node_exporter to localhost only by changing the ExecStart line:
ExecStart=/usr/local/bin/node_exporter --web.listen-address="127.0.0.1:9100"
Configuring Prometheus to scrape node_exporter
Open /etc/prometheus/prometheus.yml and add a job under scrape_configs:
scrape_configs:
- job_name: 'node_exporter'
scrape_interval: 15s
static_configs:
- targets: ['localhost:9100']
labels:
env: 'production'
The job_name identifies the source in queries and dashboards. targets points to the host and port where node_exporter listens. Labels like env help you filter metrics later.
Validate the config before restarting:
promtool check config /etc/prometheus/prometheus.yml
If it passes, reload Prometheus without downtime:
sudo systemctl reload prometheus
Open http://<your-prometheus-ip>:9090, go to Status > Targets and check the node_exporter job shows a green UP status. Run a quick query like node_cpu_seconds_total in the Expression Browser to confirm data is flowing.
Securing your monitoring stack
Never expose ports 9090 or 9100 to the public internet. On Ubuntu/Debian, restrict node_exporter access to your Prometheus server's IP:
sudo ufw allow from <prometheus-ip> to any port 9100
On CentOS/RHEL with firewalld:
firewall-cmd --permanent --add-port=9100/tcp
For the Prometheus web UI, put it behind a reverse proxy like Nginx with basic auth and TLS. A mesh VPN like Tailscale is another option if you need access from multiple locations without exposing ports directly.
Monitoring best practices and next steps
Use node_memory_MemAvailable_bytes instead of MemFree for memory alerts. MemAvailable accounts for buffers and cache, giving a more accurate picture of what's actually free.
Disable collectors you don't need (wifi, nfs, bcache) with the --no-collector.<name> flag to reduce noise.
For disk space alerts, the predict_linear PromQL function lets you forecast when a volume will fill up based on current trends. Setting a 7-day prediction window catches slow leaks before they become outages.
To monitor multiple servers, install node_exporter on each machine and add their IPs to the targets list in prometheus.yml. For larger environments, switch to file-based service discovery instead of hardcoding IPs.
Adding Grafana gives you visual dashboards. The Node Exporter Full dashboard (ID 1860) is a good starting point. Alertmanager routes critical alerts to Slack, email or PagerDuty.
FDC's dedicated servers and VPS plans support Prometheus and node_exporter out of the box. See FDC's dedicated server options.
Troubleshooting
| Issue | Likely cause | Command to check |
|---|---|---|
| Service fails to start | Wrong binary path or permissions | journalctl -u node_exporter -xe |
| Metrics not reachable | Firewall blocking port 9100, or wrong bind address | ss -lntp | grep 9100 |
| Target Down in Prometheus | Network issue or wrong target IP in prometheus.yml | curl -I http://<target-ip>:9100/metrics |
| Missing specific metrics | Collector disabled by default | node_exporter --help |

Prometheus and node_exporter setup guide
Install Prometheus and node_exporter, configure scrape targets, set up systemd services and secure your monitoring stack. Step-by-step for Linux.
15 min read - May 29, 2026
XDP and eBPF for Linux Packet Processing
14 min read - May 27, 2026

Have questions or need a custom solution?
Flexible options
Global reach
Instant deployment
Flexible options
Global reach
Instant deployment