必须将SetOutputFilter RATE_LIMIT嵌套在、或容器内,不可置于根层级;需确保mod_ratelimit已启用、路径匹配准确,三者缺一不可。

不能在 <virtualhost></virtualhost> 根层级直接写 SetOutputFilter RATE_LIMIT,否则会报 Invalid command 'SetOutputFilter' 错误。必须把限流指令嵌套在 <location></location>、<directory></directory> 或 <files></files> 容器内,同时确保模块已启用、路径匹配准确——三者缺一不可。
每个虚拟主机单独配 <location></location>
<location></location> 匹配的是请求 URI,比 <directory></directory>(匹配磁盘路径)更适合虚拟主机场景,尤其当存在 Alias、Rewrite 或反向代理时更稳定。
- 为 site-a.example.com 设置 150 KB/s 下载限速:
ServerName site-a.example.com
DocumentRoot /var/www/site-a
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 150
- 为 site-b.example.com 设置 50 KB/s 限速,配置完全独立,互不影响:
ServerName site-b.example.com
DocumentRoot /var/www/site-b
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 50
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
注意单位和数值格式
rate-limit 的值单位是 KB/s,只接受正整数,不支持小数或带单位写法。
-
SetEnv rate-limit 200→ 合法,表示约 1600 Kbps -
SetEnv rate-limit 0.2→ 被截断为 0,实际不限速 -
SetEnv rate-limit 200k或200KB→ 解析失败,配置无效
确保模块启用且重启生效
仅 a2enmod ratelimit 不够,必须完整重启 Apache 才能加载过滤器逻辑。
- Debian/Ubuntu:
sudo systemctl restart apache2 - RHEL/CentOS:
sudo systemctl restart httpd -
systemctl reload或apachectl graceful不会重新初始化 mod_ratelimit 过滤器链,限流不生效
验证是否真正走限流
用 curl 检查响应头,确认内容由 Apache 直接输出且未被绕过:
- 执行:
curl -sI http://site-a.example.com/test.bin - 若返回含
Content-Length且无Transfer-Encoding: chunked,说明 mod_ratelimit 正在作用 - 若返回
X-Sendfile、X-Accel-Redirect或经 PHPreadfile()输出但未关闭 output buffering,则限流失效

















