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

Apache 的 Timeout 参数本身不直接“预防连接挂起”,它只是整个请求生命周期的总等待上限(建连、收头、收体、发响应),设得过大反而会加剧挂起——比如一个慢速攻击连接能卡住 worker 长达 300 秒。真正要防挂起,得靠分阶段限速 + 精准超时协同控制。
别单独调 Timeout,先确认它是否真在起作用
现代 Apache(2.2.15+)中,Timeout 已退居为兜底值。只要启用了 mod_reqtimeout,它的优先级就低于 RequestReadTimeout。换句话说:你改了 Timeout 10,但没配 mod_reqtimeout,那对慢头/慢体攻击几乎无效;而配了 mod_reqtimeout 后,Timeout 只会在极端异常(如 SSL 握手卡死)时才触发。
- 检查模块是否启用:
apachectl -M | grep reqtimeout - 确认配置位置正确:必须写在服务器级上下文(
httpd.conf或),不能放在或.htaccess中 - 默认值 300 秒很危险,尤其面向公网时,建议先压到 25–30 秒作为安全基线
用 RequestReadTimeout 替代粗粒度 Timeout 控制挂起
mod_reqtimeout 是防挂起的核心,它把请求拆成“头”和“体”两阶段,每阶段都带时间窗 + 最小速率双保险:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
RequestReadTimeout header=20-40,minrate=500:客户端必须 20 秒内开始发头,40 秒内发完全部头字段,且任意 2 秒内至少传 1000 字节(即 ≥500 字节/秒) -
RequestReadTimeout body=20,minrate=500:POST 等请求体传输,每 20 秒内必须收到 ≥1000 字节,否则断连 - HTTPS 站点建议上调初始值:header=25-45,minrate=500(避免 TLS 握手延迟误杀)
- 务必两个参数都配,否则攻击者可绕过头防护,专攻 body 慢传
配合 KeepAliveTimeout 和 MPM 防止空闲连接假性挂起
很多“挂起”其实是空闲 Keep-Alive 连接长期滞留造成的,和 Timeout 无关,但会被误认为是它的问题:
- KeepAliveTimeout 设为 2–5 秒(API 类服务选 3 秒,静态资源多可放宽到 8–12 秒)
- 高危入口(如登录页、/api/v1/auth)直接关掉复用:
KeepAlive Off - 用
mpm_event模式(非 prefork),并确保MaxRequestWorkers有余量(建议 100–200) - 改完必须完整重启:
systemctl restart apache2(graceful不生效)
验证挂起是否真被拦截
配置写完不等于生效,得实测行为:
- 用
slowhttptest -c 10 -t GET -u http://your-site/ -i 10 -r 1模拟慢头注入,观察连接是否在 40 秒内断开 - 查错误日志:
tail -f /var/log/apache2/error.log | grep -i "timeout\|denied",应看到request read timeout记录 - 用
ss -tnp | grep :80 | grep ESTABLISHED | wc -l对比调优前后空闲连接回落速度










