Nginx 状态监控
网站出问题时先看 Nginx:多少连接、处理了多少请求、读写等待分布如何。内置 stub_status 能实时吐出一组关键计数,再配合 access.log 统计,大多数性能问题都能快速定位。
启用 stub_status
stub_status 模块默认不编译(需 --with-http_stub_status_module),发行版软件包一般已包含。配置一个受保护的访问入口:
server {
listen 80;
location = /nginx_status {
stub_status on; # 输出状态信息
access_log off;
allow 127.0.0.1; # 只允许本机
allow 10.0.0.0/8; # 内网监控机
deny all; # 其余一律拒绝,状态页绝不公开
}
}
nginx -t && nginx -s reload
curl -s http://127.0.0.1/nginx_status
# 输出:
# Active connections: 42
# server accepts handled requests
# 385120 385120 796482
# Reading: 0 Writing: 1 Waiting: 41
指标解读
| 指标 | 含义 | 健康关注点 |
|---|---|---|
| Active connections | 当前活动连接数 | 持续逼近上限说明要扩容(见性能调优章) |
| accepts | 累计接受的连接总数 | 累计值,看增量 |
| handled | 累计处理的连接总数 | 应约等于 accepts |
| requests | 累计处理的请求总数 | requests/accepts 即平均每连接请求数 |
| Reading | 正在读请求头的连接 | 持续偏高说明流量激增 |
| Writing | 正在写响应的连接 | 后端慢时这里会堆积 |
| Waiting | 空闲 keepalive 连接 | 正常时应占大头 |
handled 明显小于 accepts 时,多半是 worker_connections 不足导致连接被拒,去 error.log 查 limit 类报错。
接入 Prometheus
监控平台常把 stub_status 暴露给第三方采集器:nginx-prometheus-exporter 周期性抓取上面的文本并转成 nginx_connections_active 等 Prometheus 指标,交给 Grafana 画图,一个受保护的 location 加一条启动命令即可。
用 access.log 做统计
状态码分布与每秒请求数(QPS)用 awk 就能算:
# 状态码分布(combined 格式下第 9 列是 $status)
awk '{cnt[$9]++} END {for (c in cnt) print c, cnt[c]}' access.log | sort -k2 -rn
# 输出:200 18924 / 404 302 / 500 12
# 每秒请求数 Top(按 [14/Mar/2025:10:22:31 时间戳聚合)
awk -F'[[]' '{split($2,t," "); print t[1]}' access.log | sort | uniq -c | sort -rn | head -3
# 输出:253 14/Mar/2025:10:22:31
5xx 占比突然升高时,把统计按小时切分对比,再翻 error.log 定位后端原因。
小结
监控三板斧:stub_status 实时看连接与读写分布(handled、Reading、Waiting 是关键指标),access.log + awk 统计 QPS 与状态码,生产环境再接 Prometheus exporter 做长期留痕与告警。