目录
[二、方案 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,且有成熟的标准化方案,核心覆盖两大监控维度:
- Nginx 容器运行状态监控:容器的 CPU、内存、磁盘 IO、网络、存活状态、重启次数等资源与生命周期指标;
- Nginx 业务性能指标监控:Nginx 自身的 QPS、活跃连接数、请求状态码分布、请求处理耗时、SSL 握手等业务核心指标。
下面给你完整可直接落地的部署、配置、告警全流程,全程适配 Docker 环境,配置可直接复制使用。
一、前置准备
- 已正常运行 Docker 环境,且 Nginx 容器已部署启动;
- 已搭建可正常运行的 Prometheus 服务,且已开启
--web.enable-lifecycle热重载参数; - 服务器防火墙已放开对应端口(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.yml 的 scrape_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:持久化配置(生产推荐)
-
本地新建 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; } } -
将配置文件挂载到 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.yml 的 scrape_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
-
在
prometheus.yml中新增规则文件引用:rule_files: - "rules/ssl_rules.yml" # 你之前的SSL证书规则 - "rules/container_alerts.yml" - "rules/nginx_alerts.yml" -
热重载 Prometheus 使配置生效:
bashcurl -X POST http://localhost:9090/-/reload
2. 核心验证步骤
-
访问 Prometheus Web → Status → Targets ,确认
docker_container和nginx_business两个任务状态为UP; -
访问 Graph 页面,执行 PromQL 验证数据:
# 验证Nginx业务指标 nginx_up # 验证容器指标 container_last_seen{name="nginx"} -
访问 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
六、常见避坑指南
-
网络互通问题 :nginx-exporter 无法访问 Nginx 的 stub_status 时,优先检查:
- 两者是否在同一个 Docker 网络,可通过
--network 自定义网络名统一网络; - Nginx 配置中的
allow网段是否包含 exporter 的 IP; - 宿主机防火墙是否放开对应端口。
- 两者是否在同一个 Docker 网络,可通过
-
指标无数据 :优先在服务器本地 curl exporter 的 metrics 地址,确认是否有指标返回:
bashcurl http://127.0.0.1:9113/metrics curl http://127.0.0.1:8080/metrics -
权限问题 :cAdvisor 采集不到数据时,检查是否添加了
--privileged=true权限,以及挂载目录是否正确。