Apache的Timeout参数仅控制请求头读取阶段超时,不管理请求体传输;慢速连接防护依赖mod_reqtimeout模块的分阶段限速(如header=10-30,minrate=500、body=10,minrate=500),并需配合MaxRequestWorkers、KeepAliveTimeout及event MPM等协同配置。

Apache的Timeout参数本身不直接控制慢速连接的资源释放,它只影响请求头读取阶段的超时;真正决定慢速连接何时被断开、资源何时释放的,是mod_reqtimeout模块中的配置项。
Timeout参数的实际作用范围
Timeout(默认300秒)仅约束以下三个环节:
- 接收HTTP请求行(如
GET / HTTP/1.1)的最大等待时间 - 接收每个请求头字段之间的间隔时间
- 发送响应后,等待客户端确认(如TCP ACK)的超时(仅限某些MPM下生效)
它不参与请求体(request body)传输过程的超时控制,也不干预已建立连接但传输极慢的长连接。因此,一个客户端缓慢上传大文件或逐字节发请求体,Timeout完全不起作用。
应对慢速连接的关键:mod_reqtimeout
该模块专为防御慢速攻击(如Slowloris)设计,通过分阶段限速释放连接资源:
立即学习“Java免费学习笔记(深入)”;
-
RequestReadTimeout header=10-30,minrate=500:要求请求头必须在10秒内开始、30秒内完成,且平均速率不低于500字节/秒 -
RequestReadTimeout body=10,minrate=500:请求体每10秒内至少接收500字节,否则断连 - 未启用该模块时,慢速连接可能长期占用worker进程或线程,导致连接池耗尽
其他协同配置要点
单靠超时设置不够,需配合运行时机制:
-
MaxRequestWorkers(或MaxClients)限制并发连接数,避免资源被慢连接占满 -
KeepAliveTimeout控制空闲长连接存活时间,防止大量空闲连接堆积 - 使用
eventMPM替代prefork可提升对慢连接的容忍度,因事件驱动模型不为每个连接独占线程
Java应用侧需注意的联动点
若Apache反向代理Java后端(如Tomcat),还需检查后端自身超时设置:
- Tomcat的
connectionTimeout和keepAliveTimeout应小于Apache对应值,避免“悬挂连接” - Spring Boot中
server.tomcat.connection-timeout需与Apache的RequestReadTimeout协调,防止前端已断连而后端仍在等待 - Java应用读取request.getInputStream()时,若未设读取超时,可能阻塞线程——建议用带超时的IO方式或容器级防护










