Nginx请求成功率指2xx状态码请求数占总请求数的比例,可通过access log中$status字段统计,需确保log_format包含该字段,再用awk命令或Prometheus+nginx-vts-exporter持续监控。

在 Nginx 中,请求成功率通常指返回 2xx(成功)状态码 的请求数占总请求数的比例。直接从 access log 中统计各状态码分布,是分析服务健康度最常用、最有效的方式。
确认日志格式中包含 $status 字段
Nginx 默认 access_log 格式已包含响应状态码($status),但需确保你使用的 log_format 明确包含它。例如:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
若自定义格式中漏掉 $status,所有后续分析都将失效。可通过一条测试请求(如 curl -I http://your-site/)并检查日志输出是否含三位数字状态码来验证。
用命令行快速统计成功率(Linux/macOS)
假设日志路径为 /var/log/nginx/access.log,可直接用 shell 统计:
- 总请求数:awk '{print $9}' /var/log/nginx/access.log | wc -l
- 2xx 成功请求数:awk '$9 ~ /^2[0-9]{2}$/ {count++} END {print count+0}' /var/log/nginx/access.log
- 计算成功率:echo "scale=2; $(awk '$9 ~ /^2[0-9]{2}$/ {count++} END {print count+0}' access.log) / $(wc -l
注意:$9 是默认日志格式中状态码所在字段位置,若使用了自定义 format(如含 upstream_status),需先用 awk -F'"' '{print $5}' 等方式按引号分割提取,或改用 awk '{print $NF}'(取最后一列)更稳妥。
识别关键失败状态码及其含义
成功率低不等于服务宕机,需结合具体状态码定位问题:
- 404:资源不存在——检查 URL 路由、静态文件路径、前端路由 fallback 配置
- 499:客户端主动断连(Nginx 特有)——常见于页面跳转过快、AJAX 超时取消、移动端弱网中断
- 502/503/504:后端异常——502 表示 upstream 拒绝连接;503 常因 upstream 不可用或限流;504 是 upstream 响应超时,需检查 proxy_read_timeout 和后端处理时长
- 429:已被限流——确认是否启用了 limit_req 或第三方限流模块
建议定期导出高频失败状态码 Top 10 的 URI 和 User-Agent,能快速发现爬虫、误配规则或客户端兼容性问题。
进阶:用 GoAccess 或 ELK 实现可视化监控
人工解析适合临时排查,长期运维推荐工具辅助:
- GoAccess:轻量实时分析,支持 HTML 报表,命令如 goaccess access.log -c -a --log-format=COMBINED,可直观查看状态码占比、访问时段、来源 IP 分布
- ELK Stack(或 Grafana + Loki):将日志结构化入库,用 Kibana 做状态码趋势图、失败率告警(如 5xx 占比 > 1% 持续 5 分钟触发通知)
- 也可用 Prometheus + nginx-vts-exporter,通过指标 nginx_vts_server_requests_total{code="2xx"} 直接暴露成功率,接入 Alertmanager 做 SLO 监控
这类方案把“成功率”从一次性计算变成可持续观测的 SLO 指标,对线上稳定性保障更有价值。


















