Nginx作为目前使用最广泛的反向代理和Web服务器,每天会处理海量请求,而这些请求的日志数据中藏着大量有价值的信息:哪些接口访问量最高、哪些请求耗时异常、错误率是否在攀升。单纯靠命令行工具分析日志效率低下且不直观,将Nginx与Grafana结合搭建可视化监控系统,是当前主流的做法。本文将完整讲解这套方案的搭建过程。

一、方案架构与组件选型
一套完整的Nginx可视化监控系统通常由四个部分组成:数据采集层、数据存储层、数据展示层和告警层。数据采集层负责从Nginx中提取指标,常见的有两种方案:一种是基于日志文件解析,例如使用GoAccess实时分析access.log;另一种是基于exporter主动暴露指标,例如nginx-prometheus-exporter或通过lua脚本在OpenResty中直接埋点,将请求计数器暴露在/status接口上供Prometheus抓取。
数据存储层一般选择Prometheus,它是时序数据库的代表,按时间间隔主动拉取(Pull模式)目标端点的指标数据,并内置高效的存储压缩和查询语言PromQL。数据展示层自然是Grafana,它支持丰富的图表类型,可以连接Prometheus数据源,通过拖拽方式搭建仪表盘。对于小规模场景,也可以直接使用GoAccess生成HTML报告,省去Prometheus的部署,但这种方式缺乏历史数据回溯能力,只适合快速查看实时状态。
两种方案对比下来:GoAccess部署简单、对Nginx零侵入,适合临时分析;Prometheus+Grafana方案虽然组件多一些,但支持长期存储、灵活查询和告警集成,是生产环境的标配。本文重点讲解后者的搭建流程。
二、环境准备与Nginx日志配置
假设我们在一台CentOS或Ubuntu服务器上操作,首先安装Prometheus、Grafana和nginx-prometheus-exporter。Grafana可以通过官方仓库直接安装:
# 安装Grafana sudo apt-get install -y adduser libfontconfig1 musl wget https://dl.grafana.com/oss/release/grafana_10.4.0_amd64.deb sudo dpkg -i grafana_10.4.0_amd64.deb sudo systemctl enable grafana-server --now
要让exporter获取到有价值的统计数据,需要在Nginx中开启状态模块或配置StubStatus端点。编辑nginx.conf,在server块中添加:
server {
listen 8080;
server_name localhost;
location /stub_status {
stub_status;
access_log off;
allow 127.0.0.1; # 仅允许本机访问
deny all;
}
}配置生效后,访问http://127.0.0.1:8080/stub_status可以看到当前活动连接数、总请求数、读取和写入数等信息。这些是基础指标,如果需要更细粒度的数据(比如按URL统计、按状态码统计),就需要依赖日志解析方案,例如使用nginx-log-exporter解析access.log,或者用Promtail将日志送入Loki再在Grafana中查询。
同时建议优化一下日志格式,加入请求耗时和上游响应时间字段,方便后续分析性能瓶颈:
log_format detailed '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt=$request_time uct=$upstream_connect_time '
'urt=$upstream_response_time';三、Prometheus抓取配置与Grafana面板搭建
Prometheus安装完成后,编辑prometheus.yml,添加exporter的抓取任务:
scrape_configs:
- job_name: 'nginx'
static_configs:
- targets: ['127.0.0.1:9113'] # nginx-prometheus-exporter默认端口
scrape_interval: 15s重启Prometheus后,访问其自带的web界面,在Targets页面确认nginx任务状态为UP。接下来配置Grafana:浏览器打开http://服务器IP:3000,默认账号密码均为admin,首次登录会要求修改密码。进入Configuration中的Data Sources,添加Prometheus类型的数据源,URL填写Prometheus的地址(如http://127.0.0.1:9090),点击Save and Test验证连通性。
数据源就绪后开始搭建面板。常用的几个PromQL查询语句如下:查询QPS趋势使用rate(nginx_http_requests_total[1m]),这个指标统计的是总请求数的增长速率;查询活动连接数直接使用nginx_connections_active;按状态码统计可以基于日志指标查询sum by (status) (rate(http_requests_total[1m])),并以饼图形式展示。
建议按照业务逻辑将面板分组:第一行放总览类指标(QPS、错误率、活跃连接数),第二行放状态码分布和热门接口Top10,第三行放响应时间P95/P99分位数。Grafana的Stat、Time series、Pie chart、Bar gauge这几种图表类型基本可以覆盖绝大多数展示需求。如果不想从零搭建,可以到Grafana官方仪表盘市场搜索nginx相关的现成模板,导入ID后只需微调即可使用,能节省大量时间。
四、常见问题与优化建议
搭建过程中有几个高频踩坑点值得注意。第一,exporter与Nginx版本兼容性问题,stub_status模块需要Nginx编译时包含http_stub_status_module,可以通过nginx -V 2>&1 | grep stub_status检查,如果没有该模块则需要重新编译。第二,Prometheus抓取间隔不宜设置过短,15秒是平衡精度与存储占用的常见值,抓取过于频繁会导致存储快速膨胀。
第三,日志类指标存在解析延迟,如果对实时性要求高,建议改用lua埋点方案直接在内存中维护计数器,通过OpenResty的prometheus库暴露指标,延迟可以控制在毫秒级。第四,长时间运行后Prometheus的本地存储会占用大量磁盘,可以设置--storage.tsdb.retention.time=30d控制保留周期,数据量大的场景可以引入VictoriaMetrics替换Prometheus作为存储后端,兼容性几乎无损且资源占用更低。
最后别忘了配置告警。在Grafana的Alerting中设置规则,比如当5分钟内5xx错误率超过1%时触发通知,或当P99响应时间持续高于阈值时告警,通知渠道支持邮件、钉钉、企业微信等。一套完善的可视化监控不仅能让流量状况一目了然,更能在故障发生的第一时间发出预警,是保障服务稳定性的重要基础设施。