apache超时控制需分层配置:客户端连接用timeout或requestreadtimeout,反向代理用proxytimeout和connectiontimeout,php执行靠max_execution_time和request_terminate_timeout,ftp客户端须显式设三类超时,修改后需reload并实测验证。

Apache 超时控制不是单个参数能解决的事,得按请求链路分层配:客户端连接、代理转发、后端通信、PHP执行、FTP操作等环节,各自有专属超时机制,混用或漏配都会导致“卡住”“假死”或“误判”。
Apache 自身连接超时(客户端到 Apache)
用 Timeout 控制整体网络交互上限,默认 60 秒(部分旧版 300 秒),设太高易积压连接,太低会误杀弱网用户。建议设为 10–30 秒。
更精细的做法是改用 RequestReadTimeout(Apache 2.4+):
-
header=15,MinRate=500:请求头必须 15 秒内收完,且平均速率 ≥500 字节/秒 -
body=120,MinRate=1000:上传体最多传 120 秒,最低速率 1 KB/秒
这两项能防慢速攻击,比一刀切的Timeout更准。
反向代理到后端(Apache → Tomcat/PHP-FPM 等)
-
ProxyTimeout:代理整个生命周期(建连 + 发请求 + 收响应),建议设为后端 P95 响应时间 + 5–10 秒余量,比如后端通常 800ms,可设ProxyTimeout 15 -
ProxySet connectiontimeout=3.5:专控 TCP 建连阶段(SYN→SYN-ACK),只写在<proxy></proxy>块里,且必须紧贴ProxyPass后面;值建议略小于ProxyTimeout,差值 ≥2 秒 - 别忘了关掉不必要的
keepalive:加ProxySet keepalive=off或设keepalive_timeout=3,避免复用异常连接掩盖问题
PHP 脚本执行超时(和 Apache 无关)Timeout 对 PHP 内部循环、sleep、数据库查询完全无效。真正起作用的是:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
max_execution_time = 120(php.ini):脚本最大运行秒数 - PHP-FPM 池配置里的
request_terminate_timeout = 120s:硬性 kill,优先级高于 PHP 层设置
两者要匹配,否则 FPM 会在 PHP 还没到时限时就强杀进程,日志里出现child exited on signal 15
FTP 客户端超时(Java 场景)
若用 Apache Commons Net 的 FTPClient,必须显式设三类超时(默认 defaultTimeout 和 dataTimeout 是 0,即无限等待):
-
setConnectTimeout(5000):连 FTP 控制端口(21)最多等 5 秒 -
setDefaultTimeout(10000):控制连接上读写命令/响应的空闲上限 -
setDataTimeout(30000):数据连接(上传下载)的读写空闲上限
验证与生效要点
- 所有配置修改后必须
systemctl reload apache2(或restart httpd) - 用
apachectl configtest先检查语法 - 实测比看
phpinfo()更可靠:写个sleep(45); echo 'done';脚本,观察是否真被中断 - 高可用场景下,配合
ProxyHCExpr健康探测(每 3 秒 ping/healthz),比等超时更主动
不复杂但容易忽略










