监控 apache 虚拟主机 qps 需通过独立日志打标、实时流分析(如 tail+awk 或 apachetop)、mod_status 辅助瓶颈定位,并结合 prometheus/grafana 实现长期趋势分析与告警。

监控 Apache 虚拟主机的吞吐量(QPS),核心是把每个虚拟主机当作独立服务来计量请求频次,而不是依赖全局指标。Apache 本身不直接暴露“每虚拟主机 QPS”这一原生指标,必须通过日志标记、实时流分析与辅助状态比对来实现精准归因。
为每个虚拟主机配置独立日志并打标
这是实现 QPS 拆分的基础。不能共用同一份 access_log,否则无法区分来源:
- 在每个
<virtualhost></virtualhost>块中指定专属日志路径,例如:CustomLog /var/log/apache2/app1_access.log combinedErrorLog /var/log/apache2/app1_error.log - 配合
SetEnvIf在日志中注入虚拟主机标识:SetEnvIf Host "^app1\.example\.com$" vhost=app1LogFormat "%{%Y-%m-%d %H:%M:%S}t %{vhost}e %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combinedCustomLog /var/log/apache2/app1_access.log vhost_combined - 这样每条日志开头就带
app1标签,后续统计可直接按字段过滤,避免域名解析开销
用实时工具或脚本统计每秒请求数
日志写入有缓冲,需用流式方式近实时计算 QPS,而非定时扫文件:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 用
tail -f+awk统计最近 1 秒内请求数:tail -f /var/log/apache2/app1_access.log | awk '{print systime()} {if($1==prev) c++; else {if(NR>1) print c " req/s"; c=1; prev=$1}}'
(更稳定的做法是用date +%s截断时间戳后聚合) - 使用
apachetop直接观察:apachetop -f /var/log/apache2/app1_access.log -r 1
它会每秒刷新,显示当前虚拟主机的 Requests/sec、Avg. Time、URL 分布等 - 对高频站点,可写一个简单 Python 脚本读取日志尾部,按秒级窗口滑动计数,输出 JSON 推送到 Prometheus Pushgateway
结合 mod_status 判断瓶颈是否来自该虚拟主机
虽然 mod_status 不提供虚拟主机级 QPS,但它能揭示整体资源是否被某个站点拖垮:
- 启用
ExtendedStatus On后访问/server-status?auto,关注三项:
—BusyWorkers接近MaxRequestWorkers?说明并发已满,需查哪个 vhost 请求最密集
—CPULoad飙升?配合top -p $(pgrep -f 'apache2')看进程 CPU 占用,再比对各 vhost 日志的请求密度
— Scoreboard 中大量W(发送响应)状态?可能某 vhost 后端响应慢,阻塞了整个 worker pool - 发现异常时,立刻执行:
awk -v d="$(date -d '60 seconds ago' '+%d/%b/%Y:%H:%M')"' '$4 > "["d {count++} END {print count " req/min"}' /var/log/apache2/app1_access.log
快速确认该 vhost 是否在近期持续高负载
接入 Prometheus + Grafana 实现长期趋势分析
单靠命令行只能应急,生产环境需要持久化与可视化:
- 部署
apache_exporter抓取/server-status?auto全局指标(如总请求数、繁忙 worker 数),作为辅助参考 - 用 Filebeat 或 Fluentd 收集各 vhost 的 access_log,通过 Logstash 或 Ingest Pipeline 提取
vhost字段和时间戳,写入 Elasticsearch - 在 Kibana 或 Grafana 中按
vhost分组,用count_over_time计算每分钟请求数,再除以 60 得到平均 QPS;也可用直方图展示 P95 响应时间分布 - 设置告警规则:例如 “app1 QPS 连续 5 分钟低于 10,且错误率 >5%”,可能表示上游服务异常










