可用ngxtop等工具基于Nginx access log按$host统计实时并发访问量,推荐ngxtop -l /var/log/nginx/access.log -t 1s "count 1 group host"实现秒级QPS聚合,近似反映瞬时并发压力。

直接用 Nginx 自带的 log_format + 实时日志流处理工具(如 awk、goaccess 或 ngxtop)即可统计各域名的实时并发访问量。关键不是“同时在线数”,而是“当前正在处理的请求数按 $host 分组”,这需借助 Nginx 的 $connection_requests 或更可靠的方式:基于 access log 的时间窗口滑动计数。
方法一:用 ngxtop 实时聚合(推荐,简单准)
ngxtop 是专为 Nginx 日志设计的实时分析工具,支持按 $host 分组并计算每秒请求数(QPS),可近似反映瞬时并发压力(因多数请求耗时短,QPS 与活跃连接数强相关)。
- 安装:
pip3 install ngxtop - 运行(假设日志路径为
/var/log/nginx/access.log):ngxtop -l /var/log/nginx/access.log -t 1s "count 1 group host" - 输出示例:
example.com 42
api.example.org 18
表示过去 1 秒内各域名的请求数,刷新快、延迟低。
方法二:用 awk + tail -f 滑动窗口统计(零依赖)
若无法装第三方工具,可用 shell 组合实现 5 秒级滑动窗口并发估算:
- 确保日志含
$host字段(检查log_format是否包含$host): - 执行命令(自动过滤最近 5 秒日志,按 host 计数):
tail -f /var/log/nginx/access.log | awk -v interval=5 '{now=systime(); if(NR==1) start=now; if(now-start>interval){print "=== " strftime("%H:%M:%S") " ==="; system("awk -v cutoff=" now-interval '$4 ~ /^\[/ && $4 ~ /:[0-9]+:[0-9]+/ { t=$4; gsub(/[][]/, "", t); gsub(/:/, " ", t); cmd="date -d\" "t \" +%%s 2>/dev/null"; cmd | getline sec; close(cmd); if(sec>cutoff) print $2 }' /var/log/nginx/access.log | sort | uniq -c | sort -nr'); start=now; NR=0}' - 更实用的简化版(适合调试):
tail -n 1000 /var/log/nginx/access.log | awk '{print $2}' | sort | uniq -c | sort -nr
(取最新 1000 行,按 $host 统计频次,反映近期热点)
方法三:用 GoAccess 可视化实时监控
GoAccess 支持实时模式,能按虚拟主机(host)维度展示当前活跃请求分布,并带刷新界面:
- 配置解析规则(在
~/.goaccessrc中添加):log-format %h %^ %^ %d:%t %^ "%r" %s %b "%R" "%u" %^ %v
其中%v对应$host,%d:%t对应日期+时间字段(如[10/Jan/2024:14:22:05) - 启动实时监控:
goaccess /var/log/nginx/access.log -o /tmp/report.html --real-time-html --log-format=COMBINED --time-format='%H:%M:%S' --date-format='%d/%b/%Y' --ws-url=ws://your-server-ip:7890
浏览器打开/tmp/report.html即可见 “Virtual Hosts” 标签页下的实时 host 排名。
注意事项与优化点
真正意义上的“并发连接数”在 Nginx 内部由 ngx_http_core_module 管理,无法直接从 access log 精确还原(因日志写入在请求结束时)。但以下方式可辅助验证:
- 查 Nginx 当前总连接数:
ss -s | grep "tcp:"或netstat -ant | grep :80 | wc -l - 按 host 区分需依赖日志;务必确认
log_format中已包含$host(非$server_name),尤其当使用泛域名或 SNI 时,$host来自请求头,更准确 - 高流量场景建议将 access log 缓冲(
buffer=64k flush=1s)并异步写入,避免 I/O 影响统计实时性 - 如需毫秒级精确并发,应结合 Nginx 的
stub_status模块 + 自定义 Lua 脚本(OpenResty),在请求入口记录 host 到共享字典,再定时导出


















