Prometheus 可以监控docker 部署的Nginx 吗?

目录

一、前置准备

[二、方案 1:监控 Docker 中 Nginx 容器的运行状态](#二、方案 1:监控 Docker 中 Nginx 容器的运行状态)

[1. 部署 cAdvisor(Docker 方式)](#1. 部署 cAdvisor(Docker 方式))

[2. Prometheus 抓取配置](#2. Prometheus 抓取配置)

[3. Nginx 容器专属核心指标](#3. Nginx 容器专属核心指标)

[4. 容器监控告警规则(可直接复用)](#4. 容器监控告警规则(可直接复用))

[三、方案 2:监控 Nginx 自身业务性能指标(核心)](#三、方案 2:监控 Nginx 自身业务性能指标(核心))

[步骤 1:Docker Nginx 开启 stub_status 状态页](#步骤 1:Docker Nginx 开启 stub_status 状态页)

[方式 1:持久化配置(生产推荐)](#方式 1:持久化配置(生产推荐))

[方式 2:临时测试配置](#方式 2:临时测试配置)

验证状态页是否生效

[步骤 2:部署 nginx-prometheus-exporter(Docker 方式)](#步骤 2:部署 nginx-prometheus-exporter(Docker 方式))

[步骤 3:Prometheus 抓取配置](#步骤 3:Prometheus 抓取配置)

[步骤 4:Nginx 核心业务指标](#步骤 4:Nginx 核心业务指标)

[步骤 5:Nginx 业务告警规则(可直接复用)](#步骤 5:Nginx 业务告警规则(可直接复用))

四、配置生效与验证

[1. 加载规则并重载 Prometheus](#1. 加载规则并重载 Prometheus)

[2. 核心验证步骤](#2. 核心验证步骤)

[五、常用 PromQL 速查](#五、常用 PromQL 速查)

六、常见避坑指南


Prometheus 完全可以监控 Docker 部署的 Nginx,且有成熟的标准化方案,核心覆盖两大监控维度

  1. Nginx 容器运行状态监控:容器的 CPU、内存、磁盘 IO、网络、存活状态、重启次数等资源与生命周期指标;
  2. Nginx 业务性能指标监控:Nginx 自身的 QPS、活跃连接数、请求状态码分布、请求处理耗时、SSL 握手等业务核心指标。

下面给你完整可直接落地的部署、配置、告警全流程,全程适配 Docker 环境,配置可直接复制使用。


一、前置准备

  1. 已正常运行 Docker 环境,且 Nginx 容器已部署启动;
  2. 已搭建可正常运行的 Prometheus 服务,且已开启 --web.enable-lifecycle 热重载参数;
  3. 服务器防火墙已放开对应端口(cAdvisor 8080、nginx-exporter 9113)。

二、方案 1:监控 Docker 中 Nginx 容器的运行状态

采用 Google 官方开源的 cAdvisor 实现,它是容器监控的标准组件,专门采集 Docker 容器的资源指标,Prometheus 原生支持。

1. 部署 cAdvisor(Docker 方式)

执行以下命令一键启动,适配绝大多数 Linux 系统:

bash 复制代码
docker run -d \
  --name=cadvisor \
  --restart=always \
  --privileged=true \
  -p 8080:8080 \
  -v /:/rootfs:ro \
  -v /var/run:/var/run:ro \
  -v /sys:/sys:ro \
  -v /var/lib/docker/:/var/lib/docker:ro \
  gcr.io/cadvisor/cadvisor:v0.49.1

国内镜像备选:registry.aliyuncs.com/google_containers/cadvisor:v0.49.1

2. Prometheus 抓取配置

在你的 prometheus.ymlscrape_configs 中新增以下配置:

复制代码
  - job_name: "docker_container"
    scrape_interval: 15s
    static_configs:
      - targets: ["127.0.0.1:8080"]  # 你的cAdvisor地址

3. Nginx 容器专属核心指标

指标名 核心含义
container_cpu_usage_seconds_total 容器 CPU 使用时长,用于计算 CPU 使用率
container_memory_usage_bytes 容器内存实际使用字节数
container_network_receive_bytes_total 容器网络入站流量
container_network_transmit_bytes_total 容器网络出站流量
container_last_seen 容器最后一次被发现的时间,用于判断存活
container_restart_count 容器重启次数

过滤仅看 Nginx 容器:在 PromQL 中添加 name="你的Nginx容器名" 标签过滤,例如 container_memory_usage_bytes{name="nginx"}

4. 容器监控告警规则(可直接复用)

新建 rules/container_alerts.yml,内容如下:

复制代码
groups:
- name: docker_container_alerts
  rules:
    # Nginx容器宕机/不可用
    - alert: Nginx_Container_Down
      expr: time() - container_last_seen{name="nginx"} > 60
      for: 1m
      labels:
        severity: critical
      annotations:
        summary: "Nginx容器已失联"
        description: "Nginx容器超过60秒未被发现,可能已宕机"

    # 容器CPU使用率超过80%
    - alert: Nginx_Container_CPU_High
      expr: sum(rate(container_cpu_usage_seconds_total{name="nginx"}[1m])) / sum(container_spec_cpu_quota{name="nginx"}/container_spec_cpu_period{name="nginx"}) * 100 > 80
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "Nginx容器CPU使用率过高"
        description: "Nginx容器CPU使用率持续5分钟超过80%,当前值{{ $value | printf \"%.2f\" }}%"

    # 容器内存使用率超过85%
    - alert: Nginx_Container_Memory_High
      expr: (container_memory_usage_bytes{name="nginx"} / container_spec_memory_limit_bytes{name="nginx"}) * 100 > 85
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "Nginx容器内存使用率过高"
        description: "Nginx容器内存使用率持续5分钟超过85%,当前值{{ $value | printf \"%.2f\" }}%"

    # 容器10分钟内重启超过2次
    - alert: Nginx_Container_Restart_Frequently
      expr: increase(container_restart_count{name="nginx"}[10m]) >= 2
      for: 1m
      labels:
        severity: critical
      annotations:
        summary: "Nginx容器频繁重启"
        description: "Nginx容器10分钟内重启次数达到{{ $value }}次,存在异常"

三、方案 2:监控 Nginx 自身业务性能指标(核心)

采用 Prometheus 官方维护的 nginx-prometheus-exporter 实现,需要先给 Docker 中的 Nginx 开启 stub_status 状态模块(官方 Nginx 镜像已默认编译该模块,无需重新编译,直接配置即可)。

步骤 1:Docker Nginx 开启 stub_status 状态页

方式 1:持久化配置(生产推荐)
  1. 本地新建 Nginx 状态配置文件 nginx_status.conf

    复制代码
    server {
        listen 80;
        server_name localhost;
        # 状态页地址,仅允许本地和exporter访问,不对外暴露
        location /stub_status {
            stub_status;
            allow 127.0.0.1;
            allow 172.17.0.0/16;  # 允许Docker内网网段访问
            deny all;
        }
    }
  2. 将配置文件挂载到 Nginx 容器的配置目录,重启 Nginx 容器:

    bash 复制代码
    # 停止原有nginx容器(替换为你的容器名)
    docker stop nginx
    # 重新启动nginx,挂载状态配置
    docker run -d \
      --name nginx \
      --restart always \
      -p 80:80 -p 443:443 \
      -v ./nginx_status.conf:/etc/nginx/conf.d/status.conf \
      # 你的其他挂载配置(如网站目录、SSL证书等)
      nginx:latest
方式 2:临时测试配置
bash 复制代码
# 进入nginx容器
docker exec -it nginx /bin/bash
# 进入配置目录
cd /etc/nginx/conf.d/
# 新建状态配置
cat > status.conf <<EOF
server {
    listen 80;
    server_name localhost;
    location /stub_status {
        stub_status;
        allow 127.0.0.1;
        allow 172.17.0.0/16;
        deny all;
    }
}
EOF
# 重载nginx配置
nginx -s reload
exit
验证状态页是否生效
bash 复制代码
# 进入容器内验证
docker exec nginx curl http://localhost/stub_status

返回如下内容即为成功:

复制代码
Active connections: 2 
server accepts handled requests
 10 10 23 
Reading: 0 Writing: 1 Waiting: 1 

步骤 2:部署 nginx-prometheus-exporter(Docker 方式)

一键启动,自动对接 Docker 中的 Nginx:

bash 复制代码
docker run -d \
  --name nginx-exporter \
  --restart always \
  -p 9113:9113 \
  # 对接nginx的stub_status地址,用Docker容器名互通(需和nginx在同一网络)
  --link nginx:nginx \
  nginx/nginx-prometheus-exporter:latest \
  --nginx.scrape-uri=http://nginx/stub_status

若未使用 --link,可替换为宿主机 IP:--nginx.scrape-uri=http://宿主机IP:80/stub_status

步骤 3:Prometheus 抓取配置

prometheus.ymlscrape_configs 中新增配置:

复制代码
  - job_name: "nginx_business"
    scrape_interval: 10s
    static_configs:
      - targets: ["127.0.0.1:9113"]  # nginx-exporter地址

步骤 4:Nginx 核心业务指标

指标名 核心含义
nginx_connections_active 当前活跃客户端连接数
nginx_http_requests_total 总请求数,用于计算 QPS
nginx_http_requests_total{code="2xx"} 2xx 成功请求数
nginx_http_requests_total{code="4xx"} 4xx 客户端错误请求数
nginx_http_requests_total{code="5xx"} 5xx 服务端错误请求数
nginx_connections_waiting 空闲等待连接数

步骤 5:Nginx 业务告警规则(可直接复用)

新建 rules/nginx_alerts.yml,内容如下:

复制代码
groups:
- name: nginx_business_alerts
  rules:
    # Nginx实例宕机
    - alert: Nginx_Down
      expr: nginx_up == 0
      for: 1m
      labels:
        severity: critical
      annotations:
        summary: "Nginx服务不可用"
        description: "Nginx实例已宕机,无法采集指标"

    # 5xx错误率超过5%
    - alert: Nginx_5xx_Error_Rate_High
      expr: sum(rate(nginx_http_requests_total{code=~"5xx"}[1m])) / sum(rate(nginx_http_requests_total[1m])) * 100 > 5
      for: 2m
      labels:
        severity: critical
      annotations:
        summary: "Nginx 5xx错误率过高"
        description: "Nginx 5xx错误率持续2分钟超过5%,当前值{{ $value | printf \"%.2f\" }}%"

    # 4xx错误率超过20%
    - alert: Nginx_4xx_Error_Rate_High
      expr: sum(rate(nginx_http_requests_total{code=~"4xx"}[1m])) / sum(rate(nginx_http_requests_total[1m])) * 100 > 20
      for: 3m
      labels:
        severity: warning
      annotations:
        summary: "Nginx 4xx错误率过高"
        description: "Nginx 4xx错误率持续3分钟超过20%,当前值{{ $value | printf \"%.2f\" }}%"

    # 活跃连接数超过阈值
    - alert: Nginx_Connections_High
      expr: nginx_connections_active > 1000
      for: 3m
      labels:
        severity: warning
      annotations:
        summary: "Nginx活跃连接数过高"
        description: "Nginx活跃连接数持续3分钟超过1000,当前值{{ $value }}"

四、配置生效与验证

1. 加载规则并重载 Prometheus

  1. prometheus.yml 中新增规则文件引用:

    复制代码
    rule_files:
      - "rules/ssl_rules.yml"  # 你之前的SSL证书规则
      - "rules/container_alerts.yml"
      - "rules/nginx_alerts.yml"
  2. 热重载 Prometheus 使配置生效:

    bash 复制代码
    curl -X POST http://localhost:9090/-/reload

2. 核心验证步骤

  1. 访问 Prometheus Web → Status → Targets ,确认 docker_containernginx_business 两个任务状态为 UP

  2. 访问 Graph 页面,执行 PromQL 验证数据:

    复制代码
    # 验证Nginx业务指标
    nginx_up
    # 验证容器指标
    container_last_seen{name="nginx"}
  3. 访问 Rules 页面,确认新增的告警规则已正常加载,无报错。


五、常用 PromQL 速查

复制代码
# 1. Nginx QPS(每秒请求数)
rate(nginx_http_requests_total[1m])

# 2. Nginx容器CPU使用率
sum(rate(container_cpu_usage_seconds_total{name="nginx"}[1m])) / sum(container_spec_cpu_quota{name="nginx"}/container_spec_cpu_period{name="nginx"}) * 100

# 3. Nginx容器内存使用率
(container_memory_usage_bytes{name="nginx"} / container_spec_memory_limit_bytes{name="nginx"}) * 100

# 4. Nginx 5xx错误占比
sum(rate(nginx_http_requests_total{code=~"5xx"}[1m])) / sum(rate(nginx_http_requests_total[1m])) * 100

六、常见避坑指南

  1. 网络互通问题 :nginx-exporter 无法访问 Nginx 的 stub_status 时,优先检查:

    • 两者是否在同一个 Docker 网络,可通过 --network 自定义网络名 统一网络;
    • Nginx 配置中的 allow 网段是否包含 exporter 的 IP;
    • 宿主机防火墙是否放开对应端口。
  2. 指标无数据 :优先在服务器本地 curl exporter 的 metrics 地址,确认是否有指标返回:

    bash 复制代码
    curl http://127.0.0.1:9113/metrics
    curl http://127.0.0.1:8080/metrics
  3. 权限问题 :cAdvisor 采集不到数据时,检查是否添加了 --privileged=true 权限,以及挂载目录是否正确。

相关推荐
阿沁QWQ2 小时前
Docker 核心技术和实现原理
运维·docker·容器
魔卡少女12 小时前
Nginx配置代码化自动部署詹金斯/Github方案
前端·nginx·github
Tom Ma.2 小时前
Docker 安装 OpenClaw
运维·docker·容器
LoneEon3 小时前
Kubernetes高可用集群部署教程
linux·docker·kubernetes
iuu_star3 小时前
Dify网址打不开-解决方案
docker
倔强的胖蚂蚁3 小时前
AI 人工智能配置管理 Nginx
运维·nginx·云原生
翱翔-蓝天4 小时前
WSL + Docker + GPU 安装 video-subtitle-remover 完整文档
运维·docker·容器
江湖有缘4 小时前
PanCheck 容器化部署:自建网盘链接检测服务全流程
docker
SCBAiotAigc4 小时前
2026.4.10:docker desktop内网环境安装教程
人工智能·docker·容器·具身智能