ProxyTimeout必须显式设置为后端P95响应时间的1.5–2倍(如6–8秒),不可为0或过大;配合Timeout 30、KeepAliveTimeout 5,并启用keepalive、合理设连接池,防死连接与资源耗尽。

Apache 作为反向代理对接 Java Web(如 Tomcat、Spring Boot)时,若代理超时配置不合理,容易出现“死连接”——即 Apache 等待后端响应迟迟不返回,线程/连接长期挂起,最终耗尽工作进程、连接池或系统文件描述符,引发 502/504、请求堆积甚至服务不可用。关键不是单纯加长超时,而是分层设限、明确边界、主动回收。
ProxyTimeout 必须显式设置且略大于后端处理能力
默认 ProxyTimeout 继承自全局 Timeout(通常 60 秒),但 Java 后端实际处理时间波动大(如导出报表、批量任务),需独立控制:
- 设为后端 P95 响应时间的 1.5–2 倍:例如 Tomcat 平均响应 800ms、P95 是 3.2 秒,ProxyTimeout 可设为 6–8 秒
- 绝不设为 0 或过大(如 300 秒):否则 Apache 会无限等待,线程卡死,无法释放资源
- 配合 Timeout 30(客户端总超时)使用,确保 ProxyTimeout
连接池参数要限制空闲与总量,防止连接堆积
仅靠 ProxyTimeout 不够,还需用 ProxySet 精细管理与 Java 后端的连接生命周期:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- ProxySet keepalive=On:启用 HTTP/1.1 持久连接,复用 TCP,减少后端建连压力
-
ProxySet keepalive_timeout=5:空闲连接最多保持 5 秒,必须 ≤ Tomcat 的
keepAliveTimeout(默认 20 秒) - ProxySet max=30 min=5 smax=15 ttl=60:硬上限 30 条连接,软上限 15 条,空闲 60 秒后强制释放;避免后端连接池被占满又不释放
Java 后端必须协同响应,不能只靠 Apache 单方面防御
Apache 的回收机制依赖后端及时结束事务。Tomcat 需同步调优:
立即学习“Java免费学习笔记(深入)”;
- Connector 中设
connectionTimeout="20000"(20 秒):控制接收完整请求头的时限,防慢速攻击 - 设
keepAliveTimeout="15000"(15 秒):确保 > Apache 的 keepalive_timeout(5 秒),避免 Apache 主动断连导致后端半开连接 - 检查
maxConnections≥ Apache 连接池 max × 并发请求数(如 max=30,每连接平均并发 2,则至少需 60) - 对流式接口(SSE、大文件下载),在 Location 或 ProxyPass 段加
SetEnv nokeepalive 1,禁用缓冲,直传响应
补充防御:防慢速攻击 + 监控验证
死连接常由恶意慢速请求(Slowloris)触发,Event MPM 虽有优势,仍需加固:
- 设 Timeout 10:整体请求等待上限压到 10 秒,比默认 300 秒更激进,快速切断异常连接
- 加 RequestReadTimeout header=5,MinRate=500 body=10,MinRate=500:头 5 秒内必须发完,体 10 秒内上传速率不低于 500B/s,否则 408
- 部署后用
ss -tnp | grep :8080 | wc -l查 Apache 到后端的 ESTAB 连接数,结合netstat -an | grep :80 | grep ESTAB | wc -l对比客户端连接,确认无异常堆积

















