Apache 2.4 中 Timeout 和 KeepAliveTimeout 怎么配置?

文章导读
Apache 2.4 中 Timeout 控制请求处理总时限,默认 300 秒,建议按业务改为 10–30 秒;KeepAliveTimeout 控制空闲连接释放,API 场景建议 3–6 秒,静态资源场景建议 8–12 秒。修改后必须执行完整重启(restart)而非重载(reload),否则配置不生效。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

Apache 2.4 中 Timeout 控制请求处理总时限,默认 300 秒,建议按业务改为 10–30 秒;KeepAliveTimeout 控制空闲连接释放,API 场景建议 3–6 秒,静态资源场景建议 8–12 秒。修改后必须执行完整重启(restart)而非重载(reload),否则配置不生效。

先说结论:Timeout 与 KeepAliveTimeout 需按业务类型分层配置,且修改后必须完整重启服务才能生效。

  • 适合 Web API、静态资源站及反向代理场景,需区分前端空闲与后端处理超时。
  • 先准备确认 MPM 模型及后端服务超时设置,避免反向代理链路超时不一致。
  • 验收需通过连接数监控及错误日志验证,观察 ESTABLISHED 连接数是否随请求回落。

命令速用版

直接修改 httpd.conf 或虚拟主机配置文件,以下配置适用于多数前后端分离场景:

Apache 2.4 中 Timeout 和 KeepAliveTimeout 怎么配置?
KeepAlive On
MaxKeepAliveRequests 150
KeepAliveTimeout 5
Timeout 20

修改完成后执行以下命令重启服务:

sudo systemctl restart apache2
# 或
sudo systemctl restart httpd

为什么会这样

Timeout 与 KeepAliveTimeout 作用域完全不同,混淆会导致连接堆积或请求中断。Timeout 定义服务器等待客户端发送完整请求及等待后端响应的总时限,覆盖请求头读取、请求体接收及响应发送阶段;KeepAliveTimeout 仅决定一个已处理完请求的客户端连接,在发下一个请求前能空闲多久。若 Timeout 设得过大,慢速攻击易耗尽 worker 连接槽位;若 KeepAliveTimeout 设得过大,空闲连接会长期占用 worker 进程或线程。

分步处理

按业务类型定基础值,先确认 KeepAlive 已启用,再调整超时数值。

Apache 2.4 中 Timeout 和 KeepAliveTimeout 怎么配置?
  1. 确认 KeepAlive 状态:检查配置文件中 KeepAlive 指令是否为 On,若为 Off 则 KeepAliveTimeout 不生效。
  2. 设置 KeepAliveTimeout:Web API 或前后端分离接口设为 3–6 秒;静态资源密集型页面设为 8–12 秒;移动端弱网环境可压至 1–3 秒。
  3. 设置 Timeout:若应用平均响应在 2–5 秒内,建议 Timeout 设为 10–30 秒;文件上传或长轮询接口可在虚拟主机块中单独设置更长超时。
  4. 反向代理协同:若 Apache 做反向代理,需设置 ProxyTimeout 且值应≤全局 Timeout,同时确保 ProxyPass 中配置 keepalive=on。
  5. 执行完整重启:修改后必须执行 systemctl restart apache2,不可使用 reload 或 graceful,否则新旧 worker 混跑导致连接行为不一致。

怎么验证是否生效

通过连接复用检查及活跃连接数监控确认配置生效。

  • 检查连接复用:使用 curl -v http://site/ `--output` /dev/null 2>&1 | grep "Re-using existing connection" 确认是否真复用。
  • 监控连接数:高峰时段执行 ss -tnp | grep :443 | grep ESTAB | wc -l,观察连接数是否随请求回落,而非持续上涨。
  • 查看错误日志: tail -f /var/log/apache2/error.log,关注 client timed out 或 proxy timeout 报错频率是否降低。
  • 检查 MPM 状态:启用 mod_status 查看 worker 状态,确认无大量空闲进程占用。

常见坑

  • 重载不生效:KeepAliveTimeout 是运行时参数,Apache 不支持热更新,apachectl graceful 不会生效。
  • 反向代理超时混淆:KeepAliveTimeout 不控制 Apache 到后端的通信,若后端 keepalive 超时短于 Apache,会导致连接频繁重建。
  • MPM 模型差异:mpm_event 下 KeepAliveTimeout 不宜超过 10 秒,mpm_prefork 下宜更保守(4–7 秒),因每个连接独占进程。
  • MaxKeepAliveRequests 设零:若设成 0(不限制),单个连接可能持续占用线程,建议设为 50–200。

常见问题

Timeout 和 KeepAliveTimeout 有什么区别?

Timeout 控制请求处理总时限,包括读取请求和发送响应;KeepAliveTimeout 仅控制请求完成后连接空闲等待时间。

Apache 2.4 中 Timeout 和 KeepAliveTimeout 怎么配置?

修改配置后必须重启吗?

必须完整重启,重载配置不会更新 KeepAliveTimeout 值,会导致新旧 worker 行为不一致。

默认值可以直接用吗?

默认 Timeout 300 秒偏长,易导致慢请求占用资源;默认 KeepAliveTimeout 5 秒在高并发场景下可能需调整。

参考来源

  • 如何在 Apache 中设置 KeepAliveTimeout 防止空闲连接堆积
  • 怎么调整 Apache 的请求处理超时时间提升可用性
  • 如何通过 Apache 的 Keep-Alive-Timeout 调优提升效率
  • 如何在 Apache 中通过 mod_proxy 配置不同的 Timeout 与 Keepalive 参数
  • 怎么调优 KeepAliveTimeout 参数防止 Apache 生产环境空闲连接占满实战
  • apache 配置中的 Timeout 和 KeepAliveTimeout 的解释 (未完待续)
  • apache 2.4 配置连接超时
  • 优化 Apache 配置:理解 timeout、keepalive 及其影响-CSDN 博客
  • apache 中 timeout 与 KeepAliveTimeout 的区别
  • apach 部署