timeout仅约束请求头接收、请求体接收、响应发送三阶段的i/o阻塞时长,不控制keep-alive空闲时间或反向代理通信,在现代apache中已降为mod_reqtimeout的兜底值。

Apache 的 Timeout 指令控制的是服务器在关键 I/O 阶段等待客户端响应的最长时间,不是整个请求生命周期的“总时限”,也不是防慢速攻击的主力配置。它只管三件事:接收请求头、接收请求体(如 POST 数据)、发送响应时的网络阻塞。默认值通常是 300 秒,但对现代 Web 应用来说,这个值往往偏大,容易被滥用。
Timeout 管什么、不管什么
它有效约束以下环节:
- 客户端建立连接后,迟迟不发 HTTP 请求头(比如只连上 TCP 就停住)
- 已开始发头,但中间卡顿太久,或发得极慢
- 响应生成后,往客户端写数据时因网络差而长期阻塞
但它不控制:
- Keep-Alive 连接的空闲等待时间(那是 KeepAliveTimeout 的职责)
- 反向代理转发请求后,等后端服务响应的时间(那是 ProxyTimeout)
- SSL/TLS 握手阶段耗时(这部分由 OpenSSL 或系统 TCP 参数影响)
- PHP 或 CGI 脚本执行时间(需靠
max_execution_time或ScriptTimeout)
怎么设置 Timeout 才合理
直接修改主配置文件(httpd.conf 或 apache2.conf),添加或调整这一行:
Timeout 60
常见建议值:
- 普通网站/API:30–60 秒 —— 平衡用户体验与资源释放
- 高并发静态服务:5–10 秒 —— 快速回收连接,防堆积
- 含长耗时导出接口:可临时设为 300 秒,但必须配合 mod_reqtimeout 和后端超时协同控制
注意:仅调大 Timeout 不解决慢速攻击,反而会放大 Slowloris 效果;仅调小又可能误杀弱网用户或 HTTPS 握手延迟场景。
Timeout 和 mod_reqtimeout 是什么关系
Timeout 是兜底值,mod_reqtimeout 是精准控制器。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
从 Apache 2.2.15 起,官方推荐用 RequestReadTimeout 替代粗粒度的 Timeout 做请求接入防护。例如:
RequestReadTimeout header=20-40,minrate=500 body=20,minrate=500
这表示:
- 请求头必须在前 20 秒内启动传输,40 秒内完成,且任意 2 秒至少传 1000 字节
- 请求体每 20 秒内至少收到 500 字节,否则断连
启用该模块需确认配置中包含:
LoadModule reqtimeout_module modules/mod_reqtimeout.so
且该指令只能放在全局或 <virtualhost></virtualhost> 块中,不能写在 <directory></directory> 或 .htaccess 里。
验证 Timeout 和 reqtimeout 是否生效
改完配置后必须重启服务(systemctl restart apache2 或 apachectl graceful),然后做两件事:
- 运行
apachectl -M | grep reqtimeout确认模块已加载 - 用
slowhttptest -c 1 -t GET -u http://your-site/ -i 25 -r 1模拟慢头,观察是否在 40 秒内主动断连,并检查 error_log 中是否有request read timeout记录










