需手动启用mod_ratelimit模块并在中配置SetOutputFilter RATE_LIMIT和SetEnv rate-limit(字节/秒),仅限输出流量且不支持IP或路径精细控制,适合简单带宽限制。
在虚拟主机中使用 mod_ratelimit 对特定站点限速,需确认模块已启用,并在对应虚拟主机配置块(<virtualhost></virtualhost>)内设置 setoutputfilter rate_limit 和限速参数。注意该模块仅作用于输出流量,且不支持按 ip 或路径精细区分,适合简单带宽控制。
确认 mod_ratelimit 已加载并启用
该模块不是 Apache 默认启用模块,需手动启用:
- 在 Apache 主配置(如
httpd.conf或apache2.conf)中检查是否包含:LoadModule ratelimit_module modules/mod_ratelimit.so(Linux/Unix)或LoadModule ratelimit_module modules/mod_ratelimit.dll(Windows) - 若使用 Debian/Ubuntu,可运行
a2enmod ratelimit && systemctl reload apache2 - 重启 Apache 后执行
apachectl -M | grep ratelimit验证是否生效
在虚拟主机配置中为指定站点启用限速
在目标站点的 <virtualhost></virtualhost> 块内添加限速指令,例如限制所有响应输出为 100KB/s:
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/example
<pre class="brush:php;toolbar:false;"># 启用限速过滤器,单位为 bytes/second
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 102400 # 100 KB = 102400 bytes
-
SetOutputFilter RATE_LIMIT是触发限速的关键指令,必须存在 -
SetEnv rate-limit N中的N是字节每秒(bytes/sec),非 KB/s 或 Mbps;100KB/s = 102400 - 限速作用于整个虚拟主机的所有响应(含静态文件、PHP 输出等),无法按 URL 路径单独设置
可选:结合 SetEnvIf 实现条件限速(如仅限图片)
虽然 mod_ratelimit 本身不支持路径匹配,但可通过 SetEnvIf 设置环境变量,再配合 SetOutputFilter 的条件应用实现粗粒度控制:
# 仅对 .jpg/.png/.gif 响应限速 SetEnvIf Request_URI "\.(jpg|jpeg|png|gif)$" rate-limited SetOutputFilter RATE_LIMIT SetEnvIf rate-limited 1 rate-limit=51200
- 先用
SetEnvIf匹配请求 URI 并设标记(如rate-limited) - 再用
SetEnvIf判断该标记是否存在,存在则设置rate-limit值 - 注意:此方式依赖 Apache 环境变量传递顺序,需确保
SetEnvIf在SetOutputFilter之前执行
注意事项与替代建议
mod_ratelimit 功能较基础,实际使用中需留意:
- 不支持并发连接数限制,仅控制单个响应的输出速率
- 对压缩内容(如 gzip)限速效果可能偏差,因压缩后体积变化影响实际带宽占用
- 若需更精细控制(如按 IP、URL、HTTP 方法限速),推荐改用
mod_evasive、mod_qos或反向代理层(如 Nginx 的 limit_req/limit_conn) - 虚拟主机托管环境下,部分服务商禁用自定义
SetOutputFilter,此时需联系支持或改用应用层限速(如 PHP 中 sleep() 或流控逻辑)

















