Docker Compose一键部署Prometheus+Grafana+nginx-prometheus-exporter是最轻量可复现的容器化监控方案,核心是三者网络互通、指标路径正确、配置即代码,并通过stub_status或access log模式采集Nginx指标,由exporter转为Prometheus格式,经Prometheus抓取后在Grafana中用成熟模板(如ID 10587)可视化。

用 Docker Compose 一键拉起 Prometheus + Grafana + nginx-prometheus-exporter,是最轻量、可复现的容器化监控方案。核心在于三者网络互通、指标路径正确、配置即代码。
确保 Nginx 暴露可采集的指标
容器内 Nginx 不需要编译模块,只需启用 stub_status 或规范 access log 格式:
- 在 Nginx 配置中添加 location 块(仅用于 stub_status 方式):
location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; deny all; } - 若用 access log 模式(推荐),确保 log_format 包含 $status、$upstream_response_time、$host 等关键字段,日志路径需被 exporter 容器挂载读取
- 启动 Nginx 容器时,开放 80 端口,并确保其能被同 network 的 exporter 访问(如使用 docker-compose 默认 bridge network)
部署 nginx-prometheus-exporter 容器
它是指标“翻译器”,把 Nginx 原生状态或日志转成 Prometheus 格式:
- 镜像选择官方推荐的 nginx/nginx-prometheus-exporter 或社区高星项目 nginxinc/nginx-prometheus-exporter
- 启动参数示例(stub_status 方式):
--nginx.status-url http://nginx:80/nginx_status - 若用日志模式,挂载宿主机 access.log 路径,并指定 --nginx.retain-logs 10000 --nginx.log-format '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent ...'
- 务必暴露 :9113/metrics 端口,这是 Prometheus 抓取的唯一入口
配置 Prometheus 抓取 exporter 数据
修改 prometheus.yml 中的 scrape_configs,指向 exporter 容器名和端口(非 localhost):
- job_name 设为 'nginx',targets 写成 ['nginx-exporter:9113'](与 docker-compose 中 service 名一致)
- 可加 relabel_configs 打标,例如:
- source_labels: [__address__]
target_label: instance
replacement: nginx-prod - 验证:进入 Prometheus UI → Status → Targets,看到 nginx job 状态为 UP,且抓取到类似 nginx_http_requests_total{host="example.com",status="200"} 的指标
Grafana 导入并适配 Nginx 面板
不从零建图,直接复用成熟模板,再微调适配你的标签维度:
- 登录 Grafana(默认 admin/admin),在左侧菜单点 + → Import
- 输入社区高分面板 ID,如 10587(Nginx Exporter Full)或 11725(适配 VTS 模块)
- 选择已配置好的 Prometheus 数据源,点击 Load
- 关键检查项:
— 面板变量(如 $instance)是否匹配你打的标签值
— 查询中的 label_filter(如 {job="nginx"})是否与 prometheus.yml 中 job_name 一致
— 5xx 错误率公式是否为 rate(nginx_http_requests_total{status=~"5.."}[5m]) / rate(nginx_http_requests_total[5m])


















