prometheus自动发现nginx监控目标有三种方式:1. kubernetes服务发现,通过注解和kubernetes_sd_configs动态感知pod;2. consul注册中心,exporter注册、prometheus拉取健康实例;3. 文件服务发现,通过file_sd_configs定时读取yaml文件。

要让 Prometheus 自动发现 Nginx 的监控目标,关键不是手动写死 IP 和端口,而是把 Nginx(或其 Exporter)纳入一个可被动态感知的注册体系中。常用且生产可用的方式有三种:基于 Kubernetes 原生服务发现、基于 Consul 注册中心、以及轻量级的文件服务发现。选哪种取决于你的部署环境。
Kubernetes 环境下用 kubernetes_sd_configs 自动发现
这是云原生场景最推荐的方式,无需额外组件,直接对接 K8s API,能自动感知 Pod、Service、Ingress 等资源变化。
- 确保 Nginx Exporter 已部署为 Pod 或 Sidecar,并在 Pod 上添加标准注解:
prometheus.io/scrape: "true"、prometheus.io/port: "9113"、prometheus.io/path: "/metrics" - 在
prometheus.yml的scrape_configs中配置:
- job_name: "nginx-exporter"
kubernetes_sd_configs:
- role: pod
namespaces:
names: ["default", "ingress-nginx"]
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_port]
action: replace
target_label: __port__
regex: (.+)
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__, __port__]
action: replace
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
target_label: __address__
配置生效后,所有带正确注解的 Nginx Exporter Pod 会被自动加入 targets,扩缩容或重建 Pod 无需改 Prometheus 配置。
非 Kubernetes 环境用 Consul 实现自动注册与发现
适合传统虚拟机、物理机或混合架构,Nginx Exporter 启动时向 Consul 注册,Prometheus 定期从 Consul 拉取健康实例列表。
- 启动 Consul Agent(服务端或客户端模式均可),确保 HTTP API(默认 8500 端口)可访问
- Nginx Exporter 启动时调用 Consul API 注册自身,例如:
curl -X PUT -d '{"id":"nginx-exporter-01","name":"nginx-exporter","address":"192.168.1.100","port":9113,"checks":[{"http":"http://192.168.1.100:9113/metrics","interval":"30s"}]}' http://consul-server:8500/v1/agent/service/register
- Prometheus 配置片段:
- job_name: "nginx-consul"
consul_sd_configs:
- server: "consul-server:8500"
scheme: http
datacenter: dc1
relabel_configs:
- source_labels: [__meta_consul_service]
target_label: job
- source_labels: [__meta_consul_service_address, __meta_consul_service_port]
separator: ":"
target_label: __address__
Consul 自动剔除不健康节点,Prometheus 下次刷新即可跳过失效目标。
小规模环境用 file_sd_configs 快速落地
适合没有 Consul、又不在 K8s 里的简单运维场景,通过脚本维护 YAML 文件,Prometheus 定时读取。
- 创建
/etc/prometheus/targets/nginx.yaml:
- targets:
- 192.168.1.50:9113
- 192.168.1.51:9113
labels:
job: nginx-exporter
env: production
- 在 Prometheus 配置中引用:
- job_name: "nginx-file"
file_sd_configs:
- files:
- "/etc/prometheus/targets/nginx.yaml"
refresh_interval: 60s
- 新增 Nginx 节点后,只需更新 YAML 文件并保存,Prometheus 1 分钟内自动加载,无需 reload
这种方式不依赖外部系统,但需配合 Ansible、shell 脚本或 CI/CD 流程完成文件自动更新,避免人工误操作。











