如何设置Apache虚拟主机以使用mod_logio追踪各站点带宽损耗详情?
- 内容介绍
- 文章标签
- 相关推荐
本文共计861个文字,预计阅读时间需要4分钟。
相关专题
要在 apache 虚拟主机中精准记录每个站点的真实带宽损耗,关键不是全局启用 mod_logio,而是**在每个 virtualhost 内独立配置带宽日志格式与输出路径**,确保请求级输入/输出字节数(%i 和 %o)不被其他站点干扰、不被压缩或代理逻辑掩盖。
确认并启用 mod_logio 模块
模块未加载时,%I 和 %O 在日志中恒为 “-”,不是数值缺失,而是功能不可用:
- 检查是否已启用:
apache2ctl -M | grep logio(Debian/Ubuntu)或httpd -M | grep logio(RHEL/CentOS);输出含logio_module (shared)才有效 - 若无结果:Debian 系执行
a2enmod logio && systemctl reload apache2;RHEL 系编辑/etc/httpd/conf/httpd.conf,取消#LoadModule logio_module modules/mod_logio.so的注释,再运行systemctl reload httpd
为每个虚拟主机定义专属带宽日志格式
不能复用默认 common 格式——它不含 %I/%O,且无法区分站点。必须在 <VirtualHost> 块内定义独立 LogFormat:
- 示例(放入对应 VirtualHost 配置中):
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" vhost_bandwidth -
%I是客户端发来的原始 HTTP 数据字节数(含请求头+体,不含 TCP 封包开销)%O是 Apache 实际调用 send() 发出的响应字节数(含 gzip 后体积、chunked 分隔符、代理追加头等) - 二者均为整数,单位字节,无逗号、无单位,可直接用于统计脚本累加
绑定日志路径并启用 per-vhost 统计
在同一个 <VirtualHost> 块中,使用 CustomLog 指向独立文件,并引用上一步定义的格式名:
- 示例:
CustomLog /var/log/apache2/site-a-access.log vhost_bandwidthErrorLog /var/log/apache2/site-a-error.log - 每个站点用不同路径(如
site-b-access.log),避免日志混杂;路径需确保 Apache 进程有写权限 - 无需额外开启
LogIOTrackTTFB或LogIOTrackInput/Output—— 这些指令控制的是内部指标采集开关,而 %I/%O 的记录只依赖模块加载和 LogFormat 正确使用
注意真实带宽的几个关键边界
%O ≠ Content-Length,也不等于浏览器接收的最终字节,但它是服务器侧最贴近“真实发出量”的指标:
- 启用
mod_deflate时,%O 是压缩后大小;静态文件若未压缩,%O ≈ 文件原始大小;动态 PHP 输出若未设Content-Length,%b 为 “-”,但 %O 仍有值 - 经 Nginx 反代或 CDN 时,%O 仍反映 Apache 本机发出量,但客户端实际接收量由上游决定;如需端到端带宽,应在最外层代理侧统计
- HTTP/2 下 %O 依然准确,只是少了 HTTP/1.1 的换行空格冗余;流式响应(SSE、分块传输)中,%O 是日志写入时刻已发出的字节数,非最终总量
本文共计861个文字,预计阅读时间需要4分钟。
相关专题
要在 apache 虚拟主机中精准记录每个站点的真实带宽损耗,关键不是全局启用 mod_logio,而是**在每个 virtualhost 内独立配置带宽日志格式与输出路径**,确保请求级输入/输出字节数(%i 和 %o)不被其他站点干扰、不被压缩或代理逻辑掩盖。
确认并启用 mod_logio 模块
模块未加载时,%I 和 %O 在日志中恒为 “-”,不是数值缺失,而是功能不可用:
- 检查是否已启用:
apache2ctl -M | grep logio(Debian/Ubuntu)或httpd -M | grep logio(RHEL/CentOS);输出含logio_module (shared)才有效 - 若无结果:Debian 系执行
a2enmod logio && systemctl reload apache2;RHEL 系编辑/etc/httpd/conf/httpd.conf,取消#LoadModule logio_module modules/mod_logio.so的注释,再运行systemctl reload httpd
为每个虚拟主机定义专属带宽日志格式
不能复用默认 common 格式——它不含 %I/%O,且无法区分站点。必须在 <VirtualHost> 块内定义独立 LogFormat:
- 示例(放入对应 VirtualHost 配置中):
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" vhost_bandwidth -
%I是客户端发来的原始 HTTP 数据字节数(含请求头+体,不含 TCP 封包开销)%O是 Apache 实际调用 send() 发出的响应字节数(含 gzip 后体积、chunked 分隔符、代理追加头等) - 二者均为整数,单位字节,无逗号、无单位,可直接用于统计脚本累加
绑定日志路径并启用 per-vhost 统计
在同一个 <VirtualHost> 块中,使用 CustomLog 指向独立文件,并引用上一步定义的格式名:
- 示例:
CustomLog /var/log/apache2/site-a-access.log vhost_bandwidthErrorLog /var/log/apache2/site-a-error.log - 每个站点用不同路径(如
site-b-access.log),避免日志混杂;路径需确保 Apache 进程有写权限 - 无需额外开启
LogIOTrackTTFB或LogIOTrackInput/Output—— 这些指令控制的是内部指标采集开关,而 %I/%O 的记录只依赖模块加载和 LogFormat 正确使用
注意真实带宽的几个关键边界
%O ≠ Content-Length,也不等于浏览器接收的最终字节,但它是服务器侧最贴近“真实发出量”的指标:
- 启用
mod_deflate时,%O 是压缩后大小;静态文件若未压缩,%O ≈ 文件原始大小;动态 PHP 输出若未设Content-Length,%b 为 “-”,但 %O 仍有值 - 经 Nginx 反代或 CDN 时,%O 仍反映 Apache 本机发出量,但客户端实际接收量由上游决定;如需端到端带宽,应在最外层代理侧统计
- HTTP/2 下 %O 依然准确,只是少了 HTTP/1.1 的换行空格冗余;流式响应(SSE、分块传输)中,%O 是日志写入时刻已发出的字节数,非最终总量

