「史上最全」ngx_http_status_module 深度实战指南

1、快速启用 & 最小权限

# ① 定义共享区收集虚拟主机指标
server {
    listen 80;
    server_name app.example.com;

    # 每个 server 只能绑定一个 zone,多个 server 可复用同名 zone
    status_zone app_server;
    location / {
        proxy_pass http://app_upstream;
    }
}

# ② 管理端口,仅内网可访问
server {
    listen 127.0.0.1:8080;

    # JSON 输出
    location /status { status; }
    # 简易可视化 HTML(官方附带)
    location = /status.html { root /usr/share/nginx/html; }
}

线上务必加 allow 127.0.0.1; deny all; 或 WAF/IP 白名单。

2、输出结构总览 (v8)

{
  "version": 8,
  "nginx_version": "1.13.10",
  "timestamp": 1716458256437,
  "connections": { "accepted": 17302, "active": 13, "idle": 3 },
  "requests":     { "total": 92311, "current": 7 },

  "server_zones": {
    "app_server": {
      "processing": 3,
      "requests":   88100,
      "responses":  { "1xx":0, "2xx":86391, "3xx":0, "4xx":122, "5xx":587 },
      "sent":  "4.2g",
      "received":"1.1g"
    }
  },

  "caches": {
    "cache_backend": {
      "size": "8.3g", "max_size": "10g", "cold": false,
      "hit": { "responses": 45500, "bytes":"3.2g" },
      "miss":{ "responses": 8200,  "bytes":"650m" },
      "revalidated":{ "responses":2300 }, ...
    }
  },

  "upstreams": {
    "backend": {
      "zone": "http_backend",
      "peers": [
        {
          "id": 1,
          "server": "10.0.0.11:80",
          "weight": 5,
          "state": "up",
          "active": 2,
          "requests": 55000,
          "responses": { "2xx":54000, "5xx":1000 },
          "fails": 4,
          "unavail": 1,
          "header_time": 23,
          "response_time": 45,
          "selected": 1716458233210
        },
        ...
      ],
      "queue": { "size": 0, "max_size": 100, "overflows": 5 }
    }
  },

  "slabs": {
    "cache_backend": {
      "pages": { "used": 1030, "free": 18 },
      "slots": { "64": { "used":1234,"free":33,"reqs":1.2e6,"fails":0 }, ... }
    }
  }
}

3 、指令全解

指令级别作用常见值重点提示
status;location启动状态接口最好配合内网监听、Basic Auth
status_formathttp/server/locationJSON / JSONPjson (默认)
jsonp myCallback
JSONP 可用变量:jsonp $arg_cb
status_zoneserver把当前虚拟主机或 TCP 服务的指标写入共享内存status_zone app_server;名字随意;多个 server 同名 → 合并

4、核心监控指标一览

类别必看字段运维含义
全局connections.accepted/dropped战线长短、SYN flood?
requests.total/currentQPS、突刺监测
server_zonesprocessing当前活动请求(> 线程 = 拥堵)
responses.5xx应用错误率
upstreams.peersstateup/down/unavail/checking/unhealthy/draining
fails / unavail后端故障次数、熔断触发
header_time / response_time后端平均延迟 (ms)
cacheshit/miss/stale/revalidated缓存命中率
size / max_size / coldLoader 状态、磁盘占用
slabsfails共享内存OOM,须调大 zone
streamsessions.4xx/5xxL4 直连错误

5、分布式采集与可视化

  1. Prometheus

    • telegraf / vector 拉取 /status → 转换为 metrics。
    • 或开源 nginxstatus-exporter(自带 JSON→Prom)。
  2. Grafana 示例 Dashboard

    • 官方 ID 10229(Upstreams & Caches)
    • 修改 JSON 数据源字段映射即可。
  3. 原生 HTML 面板

    • /status.html + /status,快速瞄数值。

6、性能与资源考量

维度开销来源建议
CPU计算 JSON / 字符串格式化千级 QPS 影响可忽略
内存status_zone 共享内存
upstream zone / cache zone 已有
status_zone 几 KB~MB 级;按 upstream * peers 数量预估
磁盘N/A仅 HTML 静态文件几 KB

7、升级迁移指北

旧版 status新版 API (≥1.13.3) 对应路径
/status 全局/api
/status/server_zones/api/http/server_zones
/status/upstreams/api/http/upstreams
/status/caches/api/http/caches
/status/stream/api/stream/…

脚本兼容方案:在 127.0.0.1 上用 rewrite ^/status/(.*)$ /api/$1 last; 过渡。

8、常见陷阱与排错

症状可能原因解决
404 /statuslocation 未配置 or 被 deny all;检查 server 块优先级
state":"draining" 长期存在上游被从配置移除但仍有连接正常,待请求结束后消失
slabs ... fails 激增共享内存耗尽增大 zone 中 bytes
upstreams.peers.*.response_time = 0least_time or old 1.6.x升级 1.7.10+ 或换均衡算法
Cache cold=true 持续cache loader 没跑完 or 权限检查 `ps auxgrep cache_loader`

9、生产模板清单

9.1 单节点监控服务

server {
    listen 127.0.0.1:8080;
    location /status      { status; allow 127.0.0.1; deny all; }
    location = /status.js { status_format jsonp callback=$arg_cb; }
    location = /status.html {
        root /etc/nginx/html;  # 复制官方 status.html
    }
}

9.2 Prometheus Export

# 本地拉取
bash$ curl -s http://127.0.0.1/status \
 | jq -r '.server_zones | to_entries[]| "nginx_requests_total{zone=\""+.key+"\"} "+(.value.requests|tostring)'

用 cron/sidecar 5s PushGateway。

9.3 高可用 Upstream 灰度

upstream api {
    zone api_zone 128k;  # <<— 统计需 zone
    server v1 weight=9;
    server v2 weight=1 service=gray;
}
server {
    status_zone api_front;   # <<— 对外 server Zone
}

监控 /status/upstreams/api/peers/.../requests 实时对比灰度流量。

结语

虽已被更现代的 ngx_http_api_module 取代,ngx_http_status_module 依旧在大量旧版 Nginx 与商业发行版中承担核心监控职责。熟悉其数据结构、指令和监控指标,可以让你在 无第三方二进制、零外部插件 的前提下,实现细粒度 Upstream/缓存/连接健康度可观测

如果你准备升级:

  • API 模块 路径更 RESTful,字段几乎对齐;
  • 把采集脚本 “/status/” 改成 “/api/” 基本即可平滑切换。

有其他 Nginx 监控、性能或迁移疑问?随时再来聊!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello.Reader

请我喝杯咖啡吧😊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值