直接看$status字段可快速统计4xx错误分布,需区分数量、比例、路径归属和是否真实异常四个维度:按状态码统计用awk提取$9并计数;按时间看突增需分析每分钟变化;按路径归因定位问题接口;结合host/server_name分组及过滤爬虫、健康检查等合理4xx。

直接看 $status 字段就能快速统计 4xx 客户端错误请求的分布,关键是分清“数量”“比例”“路径归属”和“是否真实异常”这四个维度。
按状态码类型统计具体分布
用 awk 提取所有 4xx 状态码并计数,能一眼看出哪类错误最常见:
- 查全部 4xx:awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | grep '^ *[0-9]\+ 4[0-9][0-9]$'
- 聚焦高频项:400(参数错误)、401/403(鉴权问题)、404(资源缺失)、429(限流触发)值得单独过滤分析
- 注意字段位置:$9 是默认 log_format 中 $status 的位置,实际需用 head -1 access.log | awk '{print NF; print $0}' 确认
按时间维度看突增趋势
单纯总数没意义,要看单位时间内的变化。比如每分钟 4xx 数量是否突然翻倍:
- 提取小时粒度:awk -F'[' '{gsub(/]/,"",$2); print substr($2,1,13), $9}' /var/log/nginx/access.log | awk '$2 ~ /^4[0-9]{2}$/ {h[$1]++} END {for (t in h) print t, h[t]}' | sort
- 发现某小时 4xx 暴涨 → 结合 error.log 查该时段是否有 upstream 连接拒绝、或前端发了大量非法 JSON
- 配合业务发布记录,判断是否灰度接口未兼容旧客户端
按请求路径归因到具体接口
4xx 不是均匀分布的,集中在某些 API 路径才说明有业务逻辑问题:
- 筛选带路径的 4xx:awk '$9 ~ /^4[0-9]{2}$/ {print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
- 重点看 /api/v1/login 返回大量 400 → 检查登录参数校验逻辑是否过严;/static/js/app.js 出现大量 404 → 前端构建产物未同步或 CDN 缓存未刷新
- 若用 Nginx Proxy Manager 管理多个代理主机,可先按 $host 或 server_name 分组再统计,避免混在一起
区分真实异常与合理 4xx
不是所有 4xx 都要告警,得过滤掉预期行为:
- 404 大量出现但来自爬虫 User-Agent(如 AhrefsBot、SemrushBot)→ 属于正常扫描,无需处理
- 健康检查探针固定返回 404(如 /healthz 路径未实现)→ 在日志中排除该 location 或加 if 条件不计入统计
- 429 高频但只出现在 /api/v1/search → 很可能是限流策略生效,需确认阈值是否合理,而非当成故障











