elb空闲超时必须大于nginx keepalive_timeout,后者又须大于后端应用连接超时,例如120s > 90s > 60s,以避免因单方面断连导致502/504或复用失败。

ELB/SLB 与后端 Nginx 的 keepalive 超时时间不匹配,是生产环境中高频导致 502、504 或连接复用失败的隐性问题。核心在于:**上游负载均衡器主动断连时,Nginx 还以为连接有效,继续复用已关闭的连接,结果发包失败或响应超时。** 解决关键不是调大某一方,而是让两端的空闲保持时间形成合理层级关系。
明确各层 keepalive timeout 的作用对象
需区分清楚三个关键超时值的实际控制方:
- ELB/SLB 空闲连接超时(Idle Timeout):指客户端与 ELB 之间 TCP 连接在无数据传输时的最大存活时间。超过该时间,ELB 主动 FIN 断开连接。
- Nginx 的 keepalive_timeout:控制 Nginx 与下游客户端(即 ELB)之间连接的 keepalive 最大空闲时长,也影响其复用 upstream 连接的行为。
- Nginx 的 proxy_*_timeout(尤其是 proxy_read_timeout):控制 Nginx 作为代理,等待后端服务(如 Tomcat、Spring Boot)响应的最长时间,与 ELB 无直接关系,但会间接影响整体链路表现。
必须遵守的时间层级关系
为避免连接被单方面关闭引发异常,应严格满足:
- ELB 空闲超时 > Nginx keepalive_timeout
- Nginx keepalive_timeout > 后端应用的连接空闲超时(如 Spring Boot 的 server.tomcat.connection-timeout)
例如:ELB 设为 120s → Nginx keepalive_timeout 设为 90s → Tomcat connection-timeout 设为 60s。这样 ELB 总是比 Nginx 更晚断连,Nginx 有足够缓冲期主动关闭旧连接或复用新连接。
检查并统一配置项
常见配置位置和推荐值:
- 阿里云 SLB/CLB:在控制台监听器设置中调整“空闲连接超时时间”,默认 60s,建议设为 120–300s(需确认业务最长响应是否可能超过该值)。
-
Nginx 主配置(http/server 块):
keepalive_timeout 90s 90s;(第二个值为发送 Keep-Alive 头中的 timeout 参数,建议与第一个一致)。 -
Nginx 代理块(location 中):确保
proxy_http_version 1.1;和proxy_set_header Connection '';已启用,否则无法真正复用 HTTP/1.1 keepalive 连接。 -
Java 应用(如 Spring Boot):通过
server.tomcat.connection-timeout=60000(单位毫秒)显式设置,避免依赖容器默认值(如 Tomcat 默认 20s),造成早于 Nginx 断连。
验证连接行为是否正常
仅改配置不够,需实测验证:
- 用
curl -v http://your-domain/观察响应头中是否有Connection: keep-alive和Keep-Alive: timeout=90; - 在 Nginx access_log 中启用
$connection_requests变量,观察单个连接处理请求数是否明显上升(说明复用生效); - 抓包(如 tcpdump)查看 FIN 包由哪端先发出,确认断连顺序符合预期;
- 压测时关注 Nginx error.log 是否仍有
upstream prematurely closed connection或recv() failed (104: Connection reset by peer)类错误。











