stub_status模块无法统计4xx错误分布,需结合access_log与实时分析工具(如awk、goaccess)或prometheus+nginx-vts-exporter实现;排查时可用grep+awk定位ip、url等源头。

要实时监控 Nginx 中 4XX 错误请求的分布情况,仅靠 stub_status 模块是不够的——它只提供连接数、请求总数、处理数等基础运行指标,不包含任何状态码分类统计。必须结合其他机制才能实现 4XX 请求的实时分布分析。
理解 stub_status 的真实能力范围
stub_status 是一个极简的内置模块,启用后仅返回类似以下的纯文本:
Active connections: 12<br>server accepts handled requests<br>15623 15623 48762<br>Reading: 0 Writing: 3 Waiting: 9
它完全不输出 400、403、404 等具体状态码数量,也无法按 URI、客户端 IP 或时间维度拆分。把它当作“错误分布看板”属于常见误解。
替代方案:用 access_log + 实时日志流分析
真正可行的做法是让 Nginx 记录详细访问日志,并用轻量工具实时解析其中的 4XX 状态码。推荐组合:
- 在
nginx.conf的http或server块中配置带状态码字段的自定义日志格式:
log_format detailed '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" $request_time;'- 将该格式应用到 access_log(例如:
access_log /var/log/nginx/access.log detailed;) - 用
tail -f配合awk或goaccess实时统计 4XX 分布:
tail -f /var/log/nginx/access.log | awk '$9 ~ /^4/ {count[$9]++} END {for (c in count) print c, count[c]}'更实用的是每秒刷新的动态统计(需另起终端):
watch -n1 'awk \'$9 ~ /^4/ {c[$9]++} END {for (i in c) print i ": " c[i]}\' /var/log/nginx/access.log | sort'进阶:用 Prometheus + nginx-vts-exporter 实现可视化 4XX 监控
若需长期趋势、告警与图表(如 Grafana),推荐使用 nginx-vts-exporter(基于 Nginx 的 nginx-module-vts):
- 它能暴露每个 upstream、server、location 的完整状态码计数(包括 400、401、403、404…)为 Prometheus metrics
- 部署后可通过查询
nginx_vts_server_request_total{code=~"4.."}获取各 4XX 类型的累计请求数 - 配合 Grafana 的「Top N」面板,可实时展示当前 TOP 5 的 4XX 状态码及其占比
快速定位异常 4XX 源头的小技巧
当发现 4XX 突增时,可立即执行以下命令辅助排查:
- 查最近 100 条 4XX 请求的来源 IP 和路径:
grep ' 4[0-9][0-9] ' /var/log/nginx/access.log | tail -100 | awk '{print $1, $7}' | sort | uniq -c | sort -nr- 检查是否集中于某类 URL(如含
.php、/api/或带异常 query 参数) - 确认是否来自爬虫、扫描器或前端 JS 错误重试(观察 User-Agent 和 Referer)











