--- title: "HTTP TCP Keep-Alive 空闲时间配置" date: 2026-01-24 lastmod: 2026-01-24 description: "http.tcp.keep_idle 配置项用于控制 TCP Keep-Alive 探测开始前的空闲等待时间。" tags: ["HTTP", "TCP", "Keep-Alive", "网络连接"] summary: "配置项作用 # http.tcp.keep_idle 配置项用于控制在连接空闲多长时间后,TCP Keep-Alive 机制开始发送探测包。 这是 TCP Keep-Alive 机制的第一个参数,定义了连接在没有任何数据传输的情况下保持活跃状态的时间,超过这个时间后才会开始发送 Keep-Alive 探测包。 配置项属性 # 配置路径: http.tcp.keep_idle 数据类型: Integer(整数,单位:秒) 默认值: -1(使用系统默认值) 最小值: -1(表示使用系统默认) 最大值: 300(5分钟) 是否可选: 是 作用域: NodeScope(节点级别) 配置项详解 # 工作机制 # TCP Keep-Alive 空闲时间流程 连接建立 │ ↓ 开始传输数据 │ ↓ 最后一条数据发送 │ ↓ 连接空闲计时开始 │ ├──────────── keep_idle 秒 ────────────┐ │ │ │ 空闲时间结束 │ │ │ ↓ │ 发送第 1 个探测包 │ │ │ 进入 keep_interval 阶段 │ └──────────── 空闲期间收到数据 ────────┐ │ 重新开始计时 │ ↓ 重置空闲计时器 空闲时间与防火墙超时 # 防火墙超时问题 无 Keep-Alive (keep_idle = -1, 系统默认 7200s): 时间: 0s ──────→ 600s ──────→ 1200s │ │ │ 连接建立 防火墙 连接被 超时断开 不可用 有 Keep-Alive (keep_idle = 300s): 时间: 0s ──→ 300s ──→ 300s ──→ 600s ──→ 600s ──→ 900s │ │ │ │ │ │ 连接 空闲 发送 空闲 发送 空闲 建立 计时 探测✅ 计时 探测✅ 计时 │ ↓ 连接保持活跃 防火墙不会断开 不同空闲时间的策略 # keep_idle = 30s(短空闲): 优点: - 快速检测断开连接 - 适合短连接场景 - 减少资源占用 缺点: - 更频繁的探测包 - 网络流量略增 - 可能误判网络抖动 keep_idle = 300s(中等空闲): 优点: - 平衡性能和可靠性 - 适合大多数场景 - 防止常见防火墙超时 缺点: - 检测断开较慢 - 可能占用连接更久 keep_idle = -1(系统默认,通常 7200s): 优点: - 最少网络开销 - 系统默认行为 缺点: - 防火墙可能先超时 - 检测断开很慢 - 可能占用僵尸连接 配置建议 # 生产环境(默认) # http: tcp: keep_alive: true keep_idle: -1 # 使用系统默认 建议: 保持默认值 -1。适用于大多数标准场景。" --- ## 配置项作用 `http.tcp.keep_idle` 配置项用于控制**在连接空闲多长时间后,TCP Keep-Alive 机制开始发送探测包**。 这是 TCP Keep-Alive 机制的第一个参数,定义了连接在没有任何数据传输的情况下保持活跃状态的时间,超过这个时间后才会开始发送 Keep-Alive 探测包。 ## 配置项属性 - **配置路径**: `http.tcp.keep_idle` - **数据类型**: `Integer`(整数,单位:秒) - **默认值**: `-1`(使用系统默认值) - **最小值**: `-1`(表示使用系统默认) - **最大值**: `300`(5分钟) - **是否可选**: 是 - **作用域**: NodeScope(节点级别) ## 配置项详解 ## 工作机制 ``` TCP Keep-Alive 空闲时间流程 连接建立 │ ↓ 开始传输数据 │ ↓ 最后一条数据发送 │ ↓ 连接空闲计时开始 │ ├──────────── keep_idle 秒 ────────────┐ │ │ │ 空闲时间结束 │ │ │ ↓ │ 发送第 1 个探测包 │ │ │ 进入 keep_interval 阶段 │ └──────────── 空闲期间收到数据 ────────┐ │ 重新开始计时 │ ↓ 重置空闲计时器 ``` ## 空闲时间与防火墙超时 ``` 防火墙超时问题 无 Keep-Alive (keep_idle = -1, 系统默认 7200s): 时间: 0s ──────→ 600s ──────→ 1200s │ │ │ 连接建立 防火墙 连接被 超时断开 不可用 有 Keep-Alive (keep_idle = 300s): 时间: 0s ──→ 300s ──→ 300s ──→ 600s ──→ 600s ──→ 900s │ │ │ │ │ │ 连接 空闲 发送 空闲 发送 空闲 建立 计时 探测✅ 计时 探测✅ 计时 │ ↓ 连接保持活跃 防火墙不会断开 ``` ## 不同空闲时间的策略 ``` keep_idle = 30s(短空闲): 优点: - 快速检测断开连接 - 适合短连接场景 - 减少资源占用 缺点: - 更频繁的探测包 - 网络流量略增 - 可能误判网络抖动 keep_idle = 300s(中等空闲): 优点: - 平衡性能和可靠性 - 适合大多数场景 - 防止常见防火墙超时 缺点: - 检测断开较慢 - 可能占用连接更久 keep_idle = -1(系统默认,通常 7200s): 优点: - 最少网络开销 - 系统默认行为 缺点: - 防火墙可能先超时 - 检测断开很慢 - 可能占用僵尸连接 ``` ## 配置建议 ## 生产环境(默认) ```yaml http: tcp: keep_alive: true keep_idle: -1 # 使用系统默认 ``` **建议**: 保持默认值 `-1`。适用于大多数标准场景。 ## 防火墙限制环境 ```yaml http: tcp: keep_alive: true keep_idle: 60 # 1 分钟 keep_interval: 10 keep_count: 5 ``` **建议**: 设置为 60-300 秒。当防火墙或其他网络设备有连接超时限制时使用。 ## 云环境配置 ```yaml http: tcp: keep_alive: true keep_idle: 30 # 30 秒 keep_interval: 5 keep_count: 8 ``` **建议**: 设置为 30-120 秒。云环境的负载均衡器可能有较短的超时。 ## 高频交互应用 ```yaml http: tcp: keep_alive: true keep_idle: 10 # 10 秒 keep_interval: 2 keep_count: 5 ``` **建议**: 设置为 10-60 秒。应用频繁交互,需要快速检测断开。 ## 代码示例 ## easysearch.yml 基础配置 ```yaml http: tcp: keep_alive: true keep_idle: -1 # 使用系统默认 ``` ## 完整 TCP Keep-Alive 配置 ```yaml http: tcp: keep_alive: true keep_idle: 120 keep_interval: 15 keep_count: 8 ``` ## 跨网络部署配置 ```yaml http: tcp: keep_alive: true keep_idle: 60 keep_interval: 10 keep_count: 5 ``` ## 快速检测配置 ```yaml http: tcp: keep_alive: true keep_idle: 15 keep_interval: 3 keep_count: 3 ``` ## 相关配置 | 配置项 | 作用 | 默认值 | |--------|------|--------| | `http.tcp.keep_alive` | 是否启用 Keep-Alive | true | | `http.tcp.keep_idle` | 空闲等待时间(秒) | -1(系统默认) | | `http.tcp.keep_interval` | 探测间隔时间(秒) | -1(系统默认) | | `http.tcp.keep_count` | 探测重试次数 | -1(系统默认) | ## 系统默认值参考 ``` 不同操作系统的默认 keep_idle Linux: - 默认值: 7200 秒(2 小时) - 查看命令: cat /proc/sys/net/ipv4/tcp_keepalive_time - 调整命令: sysctl -w net.ipv4.tcp_keepalive_time=600 macOS: - 默认值: 7200 秒(2 小时) - 查看命令: sysctl net.inet.tcp.keepidle - 调整命令: sysctl -w net.inet.tcp.keepidle=600 Windows: - 默认值: 通常为 7200000 毫秒(2 小时) - 查看注册表: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters - 默认值在不同版本可能不同 ``` ## 使用场景 ## 推荐使用系统默认的场景 - **内网环境**: 网络稳定,没有防火墙超时问题 - **短连接**: 连接使用时间短,完成后立即关闭 - **标准应用**: 没有特殊的网络环境要求 ## 推荐设置较短时间的场景 - **云环境**: AWS、Azure、阿里云等可能有连接超时 - **跨网络部署**: 通过互联网或 VPN 连接 - **防火墙限制**: 网络设备有连接超时限制 - **负载均衡器**: 通过负载均衡器访问 - **高频应用**: 需要快速检测和处理连接断开 ## 推荐设置较长时间的场景 - **稳定内网**: 数据中心内部,网络极其稳定 - **长连接应用**: 连接可能长时间空闲后继续使用 - **减少开销**: 希望减少 Keep-Alive 探测包 ## 常见防火墙超时时间 ``` 典型网络设备的连接超时时间 防火墙: - 企业防火墙: 60-300 秒(1-5 分钟) - 云防火墙: 30-120 秒 - 家用路由器: 300-600 秒 负载均衡器: - AWS ALB: 60 秒(空闲超时) - Azure LB: 240 秒 - Nginx: 60 秒(默认) NAT 设备: - 企业 NAT: 120-300 秒 - 家用 NAT: 300-900 秒 配置建议: keep_idle 应该小于网络设备的超时时间 通常设置为网络超时的 50-80% ``` ## 配置调优指南 ## 确定合适的 keep_idle ``` 步骤 1: 检查网络设备超时 查询防火墙、负载均衡器的超时设置 确定最小的超时时间 步骤 2: 设置 keep_idle keep_idle = 网络超时 × 0.6 例如,防火墙超时 120 秒: keep_idle = 120 × 0.6 = 72 秒 步骤 3: 测试验证 配置后观察连接稳定性 检查是否还有超时断开问题 根据实际情况调整 步骤 4: 监控和优化 监控连接建立和断开的情况 统计 Keep-Alive 探测的频率 优化配置以平衡性能和可靠性 ``` ## 常见问题排查 ## 问题 1: 连接被防火墙断开 ``` 现象: 长时间空闲后连接无法使用 原因: keep_idle > 防火墙超时 解决: 减小 keep_idle,使其小于防火墙超时 keep_idle: 300 → 60 ``` ## 问题 2: 过多 Keep-Alive 探测 ``` 现象: 网络中出现大量 Keep-Alive 探测包 原因: keep_idle 设置过小 解决: 增大 keep_idle keep_idle: 10 → 120 ``` ## 问题 3: 连接断开检测慢 ``` 现象: 连接断开后长时间未检测到 原因: keep_idle 设置过大 解决: 减小 keep_idle keep_idle: 7200 → 300 ``` ## 注意事项 1. **最大值限制**: 配置最大值为 300 秒(5 分钟),超过会被截断。 2. **平台支持**: 需要 Linux 或 macOS 平台才能设置此参数。 3. **JDK 版本**: Java 11+ 提供了完整的 TCP Keep-Alive 参数支持。 4. **必须启用 keep_alive**: 只有在 `http.tcp.keep_alive = true` 时此配置才生效。 5. **系统默认优先**: 设置为 `-1` 时使用系统默认值,通常是 7200 秒(2 小时)。 6. **与防火墙协调**: keep_idle 应该小于网络设备的连接超时时间。 7. **配合其他参数**: 需要与 `keep_interval` 和 `keep_count` 配合使用。 8. **总超时计算**: 连接断开检测的总时间 = `keep_idle + (keep_interval × keep_count)`。 9. **动态更新**: 此配置不支持动态更新,修改后需要重启节点。 10. **监控建议**: 监控连接超时、Keep-Alive 探测频率,评估配置效果。