Apache自带mod_ratelimit仅支持对本地静态文件做简单流式限速,不控并发、不分方法、不适用于代理或动态输出;需用<Location>绑定URI路径,设SetOutputFilter RATE_LIMIT和SetEnv rate-limit(单位KiB/s),且依赖Content-Length或chunked响应。
apache 自带的 mod_ratelimit 可以对静态文件下载做简单流式限速,但它不控制并发、不区分请求方法、也不适用于代理转发或动态输出的内容。配置前需确认它是否满足你的实际场景——比如你只提供本地存储的 zip、iso 等静态资源,并且不需要防多线程暴力下载。
启用 mod_ratelimit 模块
该模块是 Apache 官方模块,多数发行版已内置,但默认未启用:
- Debian/Ubuntu 系统:运行
a2enmod ratelimit,然后systemctl reload apache2 - RHEL/CentOS 系统:检查
httpd.conf中是否有LoadModule ratelimit_module modules/mod_ratelimit.so;若无,手动添加并重启服务 - 源码编译安装的 Apache:确保编译时启用了
--enable-ratelimit,或用apxs -a -i mod_ratelimit.c加载
在特定路径下生效限速
必须将限速逻辑绑定到 URI 路径(推荐用 <Location>),而不是磁盘路径(<Directory>),因为下载常经 Alias 或重写跳转:
-
<Location "/downloads">匹配所有以/downloads开头的请求 URI - 内部必须启用输出过滤:
SetOutputFilter RATE_LIMIT - 通过环境变量设定速率:
SetEnv rate-limit 200表示 200 KiB/s(注意单位是 KiB,不是字节;不能写小数或带单位) - 可选加初始突发量(2.4.24+):
SetEnv rate-initial-burst 1024表示前 1024 KiB 不限速
完整示例:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 150
SetEnv rate-initial-burst 512
</Location>
关键限制与常见失效原因
这个模块作用范围窄,很多看似“应该限速”的情况其实不生效:
- 后端由 PHP
readfile()输出、Nginx X-Accel-Redirect 卸载、或mod_xsendfile处理的文件:Apache 不参与内容传输,SetOutputFilter无效 - 响应头缺失
Content-Length且未使用Transfer-Encoding: chunked:模块无法估算流速,可能卡顿或跳过限速 - 通过
ProxyPass转发的请求:2.4.33 及更早版本中,mod_ratelimit对代理响应限速不可靠(2.4.34+ 修复) - 迅雷、IDM 等多线程下载工具:每个连接单独限速,总带宽仍可能跑满(需配合
mod_limitipconn控制每 IP 并发)
替代建议:更实用的限速组合
如果目标是真正可控的下载管理,仅靠 mod_ratelimit 不够:
- 要按文件类型限速(如所有 .iso 限 50 KB/s):改用
mod_bw,支持BandWidth .iso 51200 - 要限制单 IP 并发数(防多线程刷带宽):加载
mod_limitipconn,配MaxConnPerIP 2 - 要对大文件单独限速(如 >1MB 的 ZIP 限 100 KB/s):
mod_bw的LargeFileLimit application/zip 1024 102400更精准 - 要兼顾防盗链+限速:结合
mod_rewrite验证 Cookie 或 token,再套用限速规则

















