目录一、前置准备二、方案 1监控 Docker 中 Nginx 容器的运行状态1. 部署 cAdvisorDocker 方式2. Prometheus 抓取配置3. Nginx 容器专属核心指标4. 容器监控告警规则可直接复用三、方案 2监控 Nginx 自身业务性能指标核心步骤 1Docker Nginx 开启 stub_status 状态页方式 1持久化配置生产推荐方式 2临时测试配置验证状态页是否生效步骤 2部署 nginx-prometheus-exporterDocker 方式步骤 3Prometheus 抓取配置步骤 4Nginx 核心业务指标步骤 5Nginx 业务告警规则可直接复用四、配置生效与验证1. 加载规则并重载 Prometheus2. 核心验证步骤五、常用 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. 部署 cAdvisorDocker 方式执行以下命令一键启动适配绝大多数 Linux 系统docker run -d \ --namecadvisor \ --restartalways \ --privilegedtrue \ -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.12. 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{namenginx}4. 容器监控告警规则可直接复用新建rules/container_alerts.yml内容如下groups: - name: docker_container_alerts rules: # Nginx容器宕机/不可用 - alert: Nginx_Container_Down expr: time() - container_last_seen{namenginx} 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{namenginx}[1m])) / sum(container_spec_cpu_quota{namenginx}/container_spec_cpu_period{namenginx}) * 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{namenginx} / container_spec_memory_limit_bytes{namenginx}) * 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{namenginx}[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 镜像已默认编译该模块无需重新编译直接配置即可。步骤 1Docker Nginx 开启 stub_status 状态页方式 1持久化配置生产推荐本地新建 Nginx 状态配置文件nginx_status.confserver { 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 容器# 停止原有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临时测试配置# 进入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验证状态页是否生效# 进入容器内验证 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-exporterDocker 方式一键启动自动对接 Docker 中的 Nginxdocker 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-urihttp://nginx/stub_status若未使用--link可替换为宿主机 IP--nginx.scrape-urihttp://宿主机IP:80/stub_status步骤 3Prometheus 抓取配置在prometheus.yml的scrape_configs中新增配置- job_name: nginx_business scrape_interval: 10s static_configs: - targets: [127.0.0.1:9113] # nginx-exporter地址步骤 4Nginx 核心业务指标指标名核心含义nginx_connections_active当前活跃客户端连接数nginx_http_requests_total总请求数用于计算 QPSnginx_http_requests_total{code2xx}2xx 成功请求数nginx_http_requests_total{code4xx}4xx 客户端错误请求数nginx_http_requests_total{code5xx}5xx 服务端错误请求数nginx_connections_waiting空闲等待连接数步骤 5Nginx 业务告警规则可直接复用新建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 使配置生效curl -X POST http://localhost:9090/-/reload2. 核心验证步骤访问 Prometheus Web →Status → Targets确认docker_container和nginx_business两个任务状态为UP访问Graph页面执行 PromQL 验证数据# 验证Nginx业务指标 nginx_up # 验证容器指标 container_last_seen{namenginx}访问Rules页面确认新增的告警规则已正常加载无报错。五、常用 PromQL 速查# 1. Nginx QPS每秒请求数 rate(nginx_http_requests_total[1m]) # 2. Nginx容器CPU使用率 sum(rate(container_cpu_usage_seconds_total{namenginx}[1m])) / sum(container_spec_cpu_quota{namenginx}/container_spec_cpu_period{namenginx}) * 100 # 3. Nginx容器内存使用率 (container_memory_usage_bytes{namenginx} / container_spec_memory_limit_bytes{namenginx}) * 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宿主机防火墙是否放开对应端口。指标无数据优先在服务器本地 curl exporter 的 metrics 地址确认是否有指标返回curl http://127.0.0.1:9113/metrics curl http://127.0.0.1:8080/metrics权限问题cAdvisor 采集不到数据时检查是否添加了--privilegedtrue权限以及挂载目录是否正确。