关键防御是分阶段超时组合:Apache用mod_reqtimeout设header/body超时(如header=10-30,minrate=500),Nginx收紧client_header_timeout、client_body_timeout等四类超时并启用reset_timedout_connection,再配合event MPM与worker_connections调优。

防御Slowloris类慢速连接攻击,关键不是堆高超时值,而是用好分阶段、有节奏的timeout指令组合——让不守规矩的连接在不同环节被及时识别并断开,释放worker资源。
Apache:用mod_reqtimeout替代默认Timeout
原生Timeout参数(默认300秒)只管请求头读取阶段,对慢传body或长期空闲连接完全无效。真正起作用的是mod_reqtimeout模块:
- RequestReadTimeout header=10-30,minrate=500:要求客户端10秒内开始发头、30秒内发完,且平均速率不低于500字节/秒;否则立即断连
- RequestReadTimeout body=10,minrate=500:每10秒内必须收到至少500字节请求体,否则终止连接(防Content-Length声明极大但逐字节发送)
- 务必启用该模块:LoadModule reqtimeout_module modules/mod_reqtimeout.so,并在MPM为event模式下效果最佳
Nginx:收紧四类超时并强制复位
Nginx没有单独的“慢速连接模块”,但通过四个基础超时指令协同控制,可快速切断异常连接:
- client_header_timeout 5s:等待完整HTTP头部的最长时间,防Slow Headers
- client_body_timeout 5s:接收请求体时两次数据到达间隔上限,防Slow Body
- send_timeout 10s:向客户端发送响应期间两次写操作的间隔限制,防Slow Read
- keepalive_timeout 10s:长连接空闲保持时间,配合reset_timedout_connection on可清空TIME_WAIT状态
通用加固:配合连接数与MPM调优
单靠超时不够,需与并发模型联动才能防止资源耗尽:
- Apache启用event MPM,设置MaxRequestWorkers 150避免线程池过载
- Nginx调低worker_connections 1024并开启reuseport提升连接接纳效率
- 两者都建议关闭不必要的KeepAlive,或大幅缩短keepalive_timeout(如Nginx设为5–10秒)
验证是否生效的小技巧
不要只看配置写了没,要实测连接行为:
- 用curl模拟慢速头:curl -v --limit-rate 10 http://your-site/,观察是否在几秒内被断开
- 检查日志中是否有"client timed out"或"request read timeout"记录
- 压力测试时监控ss -s输出的ESTAB连接数变化趋势,应无持续缓慢增长










