监控apache需结合tcp状态与mod_status scoreboard:k表示keep-alive空闲连接,\_为空闲worker,r/w/c/s为活跃状态;ss命令统计established、time_wait等状态分布,对比busyworkers与established数可识别连接堆积或未接管问题。

监控 Apache 服务的 TCP 连接状态,核心是区分“连接生命周期各阶段”与“Apache 工作进程实际处理行为”。不能只看 netstat 的 ESTABLISHED 数,还要结合 mod_status 的 Scoreboard 和系统连接状态分布,才能准确判断是否健康复用、是否存在堆积或异常。
看 Scoreboard 中的 Keep-Alive 等待状态(K)
Apache 状态页(/server-status?refresh=5)顶部的 Scoreboard 是最直接反映连接复用行为的窗口:
- K:表示该 worker 正在维持一个 Keep-Alive 连接,等待客户端发下一个请求(已响应完毕,连接未关闭)
- _:空闲,未建立连接或 Keep-Alive 已超时关闭
- R/W/C/S:分别代表读头、写响应、关闭中、正在发送 SSL 握手等活跃状态
- 持续观察一行 Scoreboard(如
K_K__W____C),其中 K 的数量 ≈ 当前空闲 Keep-Alive 连接数;若 K 长期占 worker 总数 30% 以上且 IdleWorkers 接近 0,说明 KeepAliveTimeout 过长或客户端复用率低,worker 被无效占用
用 ss 或 netstat 统计各 TCP 状态分布
系统级命令能揭示底层连接真实分布,比单纯看“总数”更有诊断价值:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 快速统计各状态连接数:
ss -tn state established | grep ':80\|:443' | wc -l(仅 ESTABLISHED) - 完整状态分布:
ss -tn state all | awk '{print $1}' | sort | uniq -c | sort -nr - 重点关注:ESTABLISHED(正常传输)、TIME_WAIT(短连接频繁释放后残留,过多可能需调优内核)、SYN_RECV(半连接,突增可能预示 SYN Flood)、CLOSE_WAIT(对方已关闭但本端未 close,常因后端未及时释放 socket)
- 对比
BusyWorkers + IdleWorkers与ESTABLISHED数量:若后者远大于前者,说明大量连接未被 Apache 接管(如反向代理未透传、连接被中间设备截断)
查当前活跃连接来源与异常 IP
单靠总量无法定位问题,需下钻到客户端维度:
- 列出连接最多的客户端 IP:
ss -tn src :80 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -10 - 筛选长时间 Keep-Alive 的 IP:
ss -tno state established '( sport = :80 or dport = :80 )' | awk '$7 ~ /keepalive/ {print $5}' | sort | uniq -c(部分内核支持 keepalive 标记) - 发现某 IP 持续维持多个 K 状态(Scoreboard 中同一 IP 对应多个 K)、或 K 后紧接 C(快速关闭),往往是爬虫、HTTP 客户端 bug 或 CDN 配置不当的信号
关联 Apache 关键指标交叉验证
单独看连接数易误判,必须结合请求处理节奏和资源水位:
- 访问
/server-status?auto获取机器可读数据,关注:BusyWorkers(正在处理请求的进程数)、ReqPerSec(每秒请求数)、Total Accesses(总请求数) - 若
ESTABLISHED很高但ReqPerSec极低,说明连接空转,非流量高峰而是 Keep-Alive 堆积 - 若
BusyWorkers长期打满、IdleWorkers为 0,而ESTABLISHED并不高,可能是请求处理慢(如 PHP 卡住、数据库锁表),而非连接层问题 - 配合
ServerUptime和重启时间,确认近期是否有因连接耗尽触发的自动重启










