Apache的Timeout参数不适合防慢速连接,设过大(如300秒)反而加剧资源耗尽;真正有效的是启用mod_reqtimeout模块,配置RequestReadTimeout header=20-40,minrate=500和body=20,minrate=500分阶段限速,并协同KeepAliveTimeout 2–5秒及mpm_event模式实现精准防护。

Apache 的 Timeout 参数本身并不适合直接用来防止慢速连接占用资源。它只是对整个请求生命周期(建连、收头、收体、发响应)设置一个粗粒度的总等待上限,设得过大(比如默认 300 秒)反而会让慢速攻击连接长期卡住 worker,加剧资源耗尽。
真正有效的做法是放弃依赖 Timeout 主防,转而用更细粒度、分阶段的机制协同控制。
明确 Timeout 的实际作用和局限
- 它不控制 Keep-Alive 空闲时间(那是
KeepAliveTimeout的职责) - 不影响反向代理后端通信(由
ProxyTimeout或ProxySet connectiontimeout控制) - 在启用了
mod_reqtimeout的现代 Apache(2.2.15+)中,它已降为兜底值,优先级低于RequestReadTimeout - 单独调大 Timeout 会延长慢连接“合法存活”时间;调太小又可能误杀正常长请求(如大文件上传)
用 mod_reqtimeout 替代粗放式 Timeout 防护
这是防慢速 HTTP 攻击(Slowloris、Slow POST)的核心模块,必须启用并配置两阶段限速:
确认模块已加载:
apachectl -M | grep reqtimeout
若未启用,确保配置中有:LoadModule reqtimeout_module modules/mod_reqtimeout.so-
在服务器级上下文(
httpd.conf或<VirtualHost>块内,不能写在<Directory>或.htaccess中)添加:RequestReadTimeout header=20-40,minrate=500RequestReadTimeout body=20,minrate=500含义:
Apache Superset Dashboard and SQL Exploration Skill下载Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 头部:20 秒内必须开始发头,40 秒内发完全部头字段,且任意 2 秒内至少传 1000 字节(即 ≥500 字节/秒)
- 请求体(如 POST 数据):每 20 秒内至少收到 500 字节,否则断连
- HTTPS 站点可微调为
header=25-45,minrate=500,避免 TLS 握手延迟误触发
配合 KeepAliveTimeout 切断空闲连接假性挂起
很多“挂起”其实是 Keep-Alive 连接空闲滞留造成的,和 Timeout 无关:
- 将
KeepAliveTimeout设为 2–5 秒(API 类服务建议 3 秒,静态资源多可放宽至 8–12 秒) - 高危入口(如
/login、/api/v1/auth)直接关闭复用:KeepAlive Off - 若保留 KeepAlive,同步降低
MaxKeepAliveRequests至 20–50,防止单连接反复滥用
搭配 MPM 和连接数限制提升抗压能力
- 使用
mpm_event模式(非prefork或worker),利用异步事件模型减少慢连接对线程的独占 - 设置
MaxRequestWorkers为 100–200,留出余量应对突发流量 - 可选增强:加载
mod_evasive,对单 IP 每秒超 50 次新连接自动封禁,与mod_reqtimeout分层互补
验证配置是否真实生效
改完必须完整重启:systemctl restart apache2(graceful 不生效)
实测方法:
- 用
slowhttptest -c 10 -t GET -u http://your-site/ -i 10 -r 1模拟慢头注入 - 观察是否在 40 秒内断连(对应
header=20-40设置) - 查看
ErrorLog是否出现request read timeout或client denied记录(需LogLevel info或更高)
不复杂但容易忽略。

















