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

在Prometheus中采集Swarm集群多副本Nginx指标的可行性咨询

实现Swarm集群中每个Nginx副本的指标采集与Grafana接入

当然可以采集每个Nginx副本的指标并添加到Grafana仪表板!你遇到的主机名问题是Swarm服务部署中常见的网络访问痛点——单独部署的nginx-exporter通过服务名访问Nginx时,会被Swarm的负载均衡随机路由到任意副本,无法精准采集单个实例的指标。下面给你两个可靠的解决方案:

方案一:使用Sidecar容器绑定Nginx副本

这是最直接的方案,让每个Nginx副本都搭配一个专属的nginx-exporter容器,两者共享网络命名空间,exporter可以直接通过localhost访问Nginx的状态接口,完全规避主机名问题。

修改你的Swarm部署配置

将nginx-exporter作为sidecar添加到服务中,示例配置如下:

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  # 确保此配置开启了stub_status模块
    depends_on:
      - nginx-exporter
  nginx-exporter:
    image: nginx/nginx-prometheus-exporter:latest
    command: ["-nginx.scrape-uri", "http://localhost:80/nginx_status"]
    network_mode: "service:nginx"  # 共享Nginx容器的网络命名空间
    deploy:
      replicas: 2  # 与Nginx副本数保持一致

关键注意事项

  • 开启Nginx的stub_status模块:你需要在Nginx配置文件中添加状态接口,示例配置片段:
    server {
        listen 80;
        location /nginx_status {
            stub_status on;
            allow 127.0.0.1;  # 只允许本地访问,保证安全
            deny all;
        }
    }
    
  • 因为exporter和Nginx共享网络,Swarm会为每个Nginx副本分配的端口自动包含exporter的端口(默认9113),Prometheus可以通过每个副本的节点IP+9113端口采集指标。

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

如果不想用sidecar,可以让nginx-exporter作为独立服务,配合Prometheus的Swarm服务发现功能,自动识别所有Nginx副本的地址并采集指标。

步骤1:部署独立的nginx-exporter服务

version: '3.8'
services:
  nginx-exporter:
    image: nginx/nginx-prometheus-exporter:latest
    deploy:
      mode: global  # 每个Swarm节点部署一个exporter
    command: ["-nginx.scrape-uri", "http://nginx:80/nginx_status"]

步骤2:配置Prometheus的Swarm服务发现

在Prometheus配置中添加Swarm任务发现,筛选Nginx的任务实例:

scrape_configs:
  - job_name: 'nginx-swarm'
    docker_sd_configs:
      - host: unix:///var/run/docker.sock  # 确保Prometheus所在节点能访问Docker套接字
        role: task
    relabel_configs:
      - source_labels: [__meta_docker_service_name]
        regex: nginx
        action: keep
      - target_label: __address__
        replacement: '{{__meta_docker_node_ip}}:9113'  # 替换为Nginx副本所在节点的IP+exporter端口

接入Grafana

完成指标采集后,在Grafana中添加Prometheus作为数据源,然后可以导入社区维护的Nginx监控仪表板(比如包含连接数、请求速率、响应状态等指标的模板),就能直观查看每个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 07:55:18