apache virtualhost 中限速需绑定到特定虚拟主机:可用 mod_ratelimit 统一限速(如 setoutputfilter rate_limit + setenv rate-limit 51200),或 mod_bw 实现细粒度控制(如 bandwidthmodule on + bandwidth all 100000),亦可结合 setenvif 按 uri 后缀条件限速,所有配置须置于 块内。

在 Apache VirtualHost 配置中限制单个主机(即某个域名或子域名)的客户端连接带宽速度,核心思路是:**对响应输出流量做速率控制,且作用范围限定在该虚拟主机内**。Apache 原生不支持按 Host 头直接限速,但可通过模块组合实现精准绑定到特定 <virtualhost></virtualhost> 块。
用 mod_ratelimit 对整个站点统一限速
这是最轻量、无需额外编译的方案,适合限制所有响应(HTML、图片、下载文件等)的平均输出速度:
- 确认模块已启用:
LoadModule ratelimit_module modules/mod_ratelimit.so(Linux)或.dll(Windows),然后执行apachectl -M | grep ratelimit验证 - 在目标
<virtualhost></virtualhost>块内添加:SetOutputFilter RATE_LIMIT SetEnv rate-limit 51200
表示限速为 50 KB/s(51200 字节/秒);注意单位必须是字节每秒,不是 KB/s 或 Mbps - 该限速作用于该虚拟主机下所有响应体(含 PHP 输出、静态文件),无法区分路径或文件类型
用 mod_bw 实现更灵活的带宽控制
mod_bw 支持按 IP、路径、文件类型甚至 User-Agent 设置不同限速策略,更适合生产环境:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 安装后加载模块:
LoadModule bw_module modules/mod_bw.so - 在对应
<virtualhost></virtualhost>中启用并配置:BandWidthModule On ForceBandWidthModule On BandWidth all 100000 # 全局限速 100 KB/s LargeFileLimit .zip 500 10240 # ZIP 文件超 500KB 后限速 10 KB/s MaxConnection all 5 # 每 IP 最大并发连接数(可选)
- 支持细粒度来源匹配,例如:
BandWidth 192.168.1.0/24 20480或BandWidth "dl.example.com" 51200(需开启 Host 匹配支持)
结合 SetEnvIf 实现“按请求特征”条件限速
若只想限制特定资源(如大文件下载),可用 SetEnvIf 配合 mod_ratelimit 做粗粒度分流:
- 先匹配 URI 后缀标记请求:
SetEnvIf Request_URI "\.(zip|pdf|mp4)$" is_download
- 再对被标记的请求启用限速:
SetOutputFilter RATE_LIMIT SetEnvIf is_download 1 rate-limit=20480
注意:SetEnvIf必须出现在SetOutputFilter之前,否则变量不生效 - 这种方式不依赖第三方模块,但仅适用于简单正则匹配场景
注意事项与避坑点
实际配置时容易忽略的关键细节:
-
mod_ratelimit只控制服务器向客户端发送响应的节奏,不影响请求处理时间或 CPU 占用 - 限速值过低(如低于 10 KB/s)可能导致浏览器长时间等待、连接超时或断连
- 若站点启用了 gzip 压缩,限速基于压缩后数据流,实际原始内容可能更快到达客户端
- 所有限速指令都必须放在
<virtualhost></virtualhost>内,写在全局配置或.htaccess中无法绑定到特定主机










