Apache 默认 access_log 不记录服务器端渲染耗时,需后端将处理时间注入 X-Response-Time 响应头,再通过 mod_log_config 的 %{X-Response-Time}o 捕获并写入日志。

Apache 默认访问日志(access_log)不记录服务器端渲染耗时,因为它本身不执行后端逻辑(如 PHP、Java、Node.js 渲染),而是将请求转发给后端应用服务器或解释器。要评估后端性能,需由后端服务主动将处理时间注入响应头或日志字段,再通过 Apache 的 mod_log_config 捕获。
让后端输出耗时到响应头
这是最常用且可靠的方式。后端在完成渲染后,设置一个自定义响应头,例如:
- PHP(在脚本末尾):
header('X-Response-Time: ' . round((microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"]), 4)); - Spring Boot(使用 Filter 或 Interceptor):
response.setHeader("X-Response-Time", String.valueOf(durationMs)); - Node.js(Express):
res.set('X-Response-Time', `${Date.now() - start}ms`);
配置 Apache 记录该响应头
编辑 Apache 配置(如 httpd.conf 或虚拟主机配置),启用并扩展日志格式:
- 确认已加载
mod_log_config(通常默认启用) - 定义新日志格式,加入
%{X-Response-Time}o(o 表示 output header):LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{X-Response-Time}o" combined_with_rt - 在
CustomLog中使用该格式:CustomLog "/var/log/httpd/access_log" combined_with_rt
重启 Apache 后,日志中会出现类似 0.1284(单位:秒)的值,代表后端完整处理耗时。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
注意事项与常见问题
该方法依赖后端配合,但能真实反映端到端渲染延迟。需注意:
- 若后端未设置该头,Apache 日志中对应位置显示为
- - 避免用
%{X-Response-Time}i(i 是 input header),那是客户端发来的,不可信 - 高并发下,建议后端统一用毫秒整数(如
128)并设为字符串,避免小数点解析歧义 - 若使用反向代理(如 Nginx 前置),确保
ProxyPass透传响应头,且 Apache 实际收到该头
替代方案:用 mod_status + 自定义指标
如果无法修改后端代码,可结合 Apache 的 mod_status 和后端暴露的健康端点:
- 开启
ExtendedStatus On,访问/server-status?auto获取当前请求数、繁忙线程等宏观指标 - 后端单独提供
/health/perf接口返回平均渲染耗时(如 Prometheus 格式) - 用 Java 或 Python 脚本定时拉取两者数据,做关联分析(例如 BusyWorkers 上升时,后端平均 RT 是否同步升高)
这种方式不侵入访问日志,但属于间接推断,精度低于响应头注入法。


















