You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Prometheus中采集Swarm集群Nginx多副本指标并接入Grafana?

解决方案:采集Swarm集群中Nginx副本的指标到Grafana

当然可行!你遇到的主机名问题,核心原因是Docker Swarm里单个副本的网络标识没法直接通过服务名访问,而nginx-exporter需要精准指向每个Nginx实例。下面提供两种靠谱的实现方案:

方案一:Sidecar模式(推荐)

把nginx-exporter作为Nginx服务的sidecar容器部署,每个Nginx副本都会伴随一个专属的exporter——两者共享网络命名空间,exporter可以直接用localhost访问对应的Nginx实例,完美解决主机名问题。

修改你的Swarm部署配置如下:

version: '3.8'
services:
  nginx:
    image: registry:5000/nginx:2
    ports:
      - "80:80"
      - "443:443"
    deploy:
      replicas: 2
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf  # 需确保Nginx开启stub_status模块
    command: ["nginx", "-g", "daemon off;"]
  nginx-exporter:
    image: nginx/nginx-prometheus-exporter:latest
    command: ["-nginx.scrape-uri", "http://localhost:80/stub_status"]
    deploy:
      replicas: 2  # 和Nginx副本数保持一致
    depends_on:
      - nginx
    network_mode: "service:nginx"  # 关键配置:共享Nginx服务的网络命名空间

配置要点:

  • 先确保Nginx开启stub_status模块,这是exporter采集指标的基础:
    server {
        listen 80;
        location /stub_status {
            stub_status on;
            allow 127.0.0.1;  # 因sidecar共享网络,localhost访问完全安全
            deny all;
        }
    }
    
  • network_mode: "service:nginx"让exporter直接复用Nginx的网络空间,无需额外配置主机名,直接用localhost就能访问对应副本的状态端点。
  • 部署完成后,每个Nginx副本都会绑定一个专属exporter,Prometheus可以通过Swarm的服务发现(比如tasks.nginx-exporter)自动识别所有exporter实例。

方案二:Swarm服务发现+动态采集

如果不想用sidecar模式,也可以通过Swarm的DNS服务发现,让Prometheus自动识别所有Nginx副本的IP,再配置采集规则。不过这种方式相对复杂,仅作备选:

  1. 确保Nginx的stub_status模块允许Swarm overlay网络的IP段访问(比如allow 10.0.0.0/8;)。
  2. 在Prometheus配置中添加Swarm任务级别的服务发现:
    scrape_configs:
      - job_name: 'nginx'
        docker_swarm_sd_configs:
          - host: unix:///var/run/docker.sock
            role: task
        relabel_configs:
          - source_labels: [__meta_docker_swarm_service_name]
            regex: nginx
            action: keep
          - target_label: __address__
            replacement: '$__meta_docker_swarm_task_address:80'
          - source_labels: [__meta_docker_swarm_task_id]
            target_label: instance
    
  3. 部署独立的nginx-exporter服务,配置它批量采集所有Nginx副本的stub_status端点。这种方式需要确保exporter能访问到所有副本的IP,不如sidecar模式直观可靠。

接入Grafana

完成exporter部署和Prometheus配置后,只需在Grafana中添加Prometheus数据源,再导入官方的Nginx仪表板(比如ID为12900的预设仪表板),就能看到每个Nginx副本的请求量、连接数、响应时间等详细指标了。


内容的提问来源于stack exchange,提问作者TheFatal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:03:37