通过nginx日志估算并发用户数,核心是统计1秒内请求峰值(即qps峰值),再结合平均响应时间粗略换算为瞬时并发连接数;需截取日志时间戳至秒级、去噪过滤,并推荐滑动窗口统计提升准确性。

通过 Nginx 日志估算并发用户数,核心思路是:统计在**同一秒内活跃的请求连接数**,即单位时间窗口(通常为 1 秒)内的请求数量峰值。这不是精确的“在线用户”数,而是反映服务器瞬时负载能力的近似指标。
提取时间戳并归一到秒级
Nginx 默认日志格式中 $time_local 或 $time_iso8601 字段包含请求时间。需将其截断或格式化为“年-月-日 小时:分钟:秒”,丢弃毫秒部分,使同一秒内所有请求对齐。
- 若使用
$time_local(如23/Jan/2024:14:32:15 +0800),可用 awk 提取前 17 个字符:awk '{print substr($4, 2, 17)}' - 若使用
$time_iso8601(如2024-01-23T14:32:15+08:00),可截取前 19 位:awk -F'T' '{split($2,a,"+"); print $1"T"substr(a[1],1,8)}'
按秒聚合并找最大值
将每条日志映射到对应秒级时间戳后,统计每秒出现的次数,再取最大值——这就是该日志时间段内的最大瞬时并发请求数。
- 简单命令示例(假设日志路径为
/var/log/nginx/access.log): awk '{print substr($4,2,17)}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 1- 输出类似
127 23/Jan/2024:14:32:15,表示该秒有 127 个请求
注意区分“并发连接”与“并发请求”
Nginx 日志记录的是已完成的 HTTP 请求(即 access.log),不是实时 TCP 连接数。因此该数值反映的是**每秒完成的请求数(QPS)峰值**,而非同时打开的连接数(如 keepalive 连接)。若需更贴近真实并发连接,可结合 nginx_stub_status 模块的 Active connections 实时指标。
- access.log 统计的是“请求吞吐”维度,并发用户数常被粗略等同于 QPS × 平均响应耗时(单位:秒)
- 例如:峰值 QPS=100,平均响应时间=2s → 粗略估算瞬时并发连接 ≈ 200
- 但该换算依赖请求分布均匀性,突发短请求会显著低估真实连接压力
用脚本提升准确性与实用性
手动命令适合快速排查,生产环境建议用 Python 或 Logstash 做滑动窗口统计(如最近 1 秒、5 秒滚动峰值),并排除健康检查、静态资源等干扰请求。
- 过滤掉非业务请求:
grep -v '\.js\|\.css\|/health\|/ping' - 限定状态码范围(如只统计 2xx/3xx):
awk '$9 ~ /^2|^3/ {print substr($4,2,17)}' - 用 pandas 或 awk + 数组做 1 秒滑动窗口,比静态分组更能反映真实波动











