Apache不内置TBF类底层流量整形机制,而是通过mod_ratelimit(响应限速)、mod_evasive(请求频次控制)、mod_limitipconn(并发连接限制)及系统层tc协同实现应用层节流。

Apache 本身不内置“速率限制缓冲队列”这种类似 Linux 内核 tc(traffic control)中 TBF/SFQ 那样的底层流量整形机制。它没有真正的“缓冲队列调度器”,而是通过模块化方式实现请求级限速和连接数控制,属于应用层(HTTP 层)的节流,而非网络栈层的带宽整形。
但你可以用合理组合的方式,在 Apache 中达成高效、低开销、可落地的速率限制效果,核心是:避免阻塞、区分粒度、减少全局锁、配合系统层协同。
✅ 启用并配置 mod_ratelimit(轻量级响应体限速)
适用于控制单个响应的传输速率(如大文件下载),不干预请求处理逻辑,开销极低:
# 在 httpd.conf 或虚拟主机中
<IfModule mod_ratelimit.c>
<Location "/downloads/">
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 100 # 单位:KB/s
SetEnv rate-sleep 100 # 可选:每100ms检查一次(毫秒)
</Location>
</IfModule>⚠️ 注意:
-
mod_ratelimit是 Apache 2.4+ 自带模块(无需额外编译),但需确认已加载:LoadModule ratelimit_module modules/mod_ratelimit.so - 它只限响应数据发送速率,不影响请求排队或 CPU 处理;适合 CDN 回源、静态资源分发等场景。
✅ 使用 mod_evasive 防突发请求冲击(请求频次控制)
这不是“缓冲队列”,而是快速拒绝超限请求,防止连接堆积和 TIME_WAIT 暴增,间接提升吞吐稳定性:
<IfModule mod_evasive24.c>
DOSPageCount 2 # 同一页面 1 秒内最多访问次数
DOSSiteCount 50 # 全站 1 秒内最多总请求数
DOSPageInterval 1 # 页面计数窗口(秒)
DOSSiteInterval 1 # 全站计数窗口(秒)
DOSBlockingPeriod 60 # 封禁时长(秒)
DOSEmailNotify admin@example.com
</IfModule>✅ 优势:
- 零缓冲、零排队、即时响应
403,避免连接积压; - 自动 IP 封禁 + 日志记录,适合防爬虫、暴力探测;
- 编译安装简单(
apxs -i -a mod_evasive24.c),比mod_qos更轻量。
✅ 结合 mod_limitipconn 控制并发连接数(防连接耗尽)
真正解决“队列堆积”的关键——限制每个客户端 IP 的同时活跃连接数,防止慢速攻击或下载工具占满 worker:
<IfModule mod_limitipconn.c>
# 全局限制
MaxConnPerIP 3
# 或按目录限制(如后台接口更严格)
<Location "/api/">
MaxConnPerIP 1
</Location>
</IfModule>? 关键点:
- 必须配合
KeepAlive Off或极短KeepAliveTimeout 2(否则长连接会“伪装”成多个并发); - 若使用
eventMPM,效果更精准(因支持异步连接管理); - 不要设为
0(禁用),应设合理值(如 2–5),兼顾用户体验与防护。
✅ (进阶)与系统层 tc 协同:对 Apache 出向流量整形
当确实需要“缓冲+平滑输出”(例如视频流、API 批量导出),可在网卡层用 tc tbf 做出口限速,让 Apache 专注处理,系统负责调度:
# 对 eth0 出口限速至 2Mbps,带 10KB 缓冲(burst) tc qdisc add dev eth0 root tbf rate 2mbit burst 10kb latency 70ms
✅ 这样 Apache 不感知限速,无模块依赖、无上下文切换开销;
❌ 缺点:无法按 URL/IP 区分策略,是全局出口控制。
不复杂但容易忽略:
- 所有限速模块都依赖
MPM类型 —— 推荐用event(高并发 + 低内存),避免prefork下进程级限速失真; - 务必先
apachectl -t检查语法,再systemctl reload httpd; - 生产环境建议搭配
mod_status(ExtendedStatus On)实时观察Total Accesses/ReqPerSec,验证限速是否生效。


















