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 做长期留痕与告警。

笔记加载中…