长连接业务如何配置ELB Ingress负载均衡,最佳实践有哪些?
- 前端开发
- 2026-08-10
- 7
配置ELB Ingress支撑长连接业务,关键在于正确设置后端超时时间、启用长连接模式,并合理规划Ingress控制器参数,以确保业务稳定和低延迟。
长连接业务如WebSocket、gRPC、流媒体实时推送,需要长时间保持连接,如果采用默认的ELB Ingress配置,很容易遇到连接意外断开,原因在于多数云厂商ELB的默认超时时间较短,通常只有60秒,针对长连接进行专门的ELB Ingress配置是所有相关业务的必经之路。
长连接业务配置ELB Ingress负载均衡的关键参数
要保障长连接稳定性,需要从ELB实例和Ingress控制器两个层面调整参数,下面列出最关键的几个配置项及其作用。
后端超时与空闲超时设置
ELB负责前端与后端服务之间的连接转发,对于长连接,必须同时调整前端连接超时和后端连接超时,避免因超时设置过短导致连接中断。
- 请求超时(client_timeout):控制ELB等待后端响应的时间,对于长连接业务,建议设置为0或一个较大值(如3600秒),如果设置为0,表示不超时,但需注意后端服务自身的超时配置。
- 空闲超时(keepalive_timeout):控制连接空闲多长时间后关闭,长连接经常有间隔性的空闲时段,因此必须设置足够长,例如300秒或更高,很多云厂商的ELB默认空闲超时为60秒,这直接导致长连接频繁断开。
- 后端超时(backend_timeout):控制ELB向后端转发请求的超时,同样需要适当调整,避免后端处理耗时较长时被中断。
长连接模式与短连接切换
ELB支持HTTP和TCP两种监听模式,对于HTTP长连接,需要确保HTTP keep-alive生效;如果选择TCP监听,则直接透传TCP连接,没有HTTP层面的超时限制,但后端服务需要自己管理连接状态。
- TCP监听:适用于完全由后端控制连接的生命周期,如WebSocket和自定义协议,配置简单,无需处理HTTP keep-alive,但无法利用ELB的HTTP高级特性。
- HTTP监听:需要开启keep-alive,并设置合适的超时,部分云厂商的ELB Ingress提供注解来控制keep-alive行为,如kubernetes.io/elb.keepalive_timeout。

健康检查与会话保持适配
健康检查如果过于频繁,可能主动断开长连接,建议采取以下调整:
- 降低健康检查间隔,改为30秒一次。
- 使用TCP健康检查替代HTTP健康检查,避免额外的请求干扰长连接。
- 对于需要保持会话的业务,开启基于源IP或Cookie的会话保持,确保同一客户端的请求始终路由到同一后端。
长连接业务ELB Ingress的TCP与HTTP方案对比
在配置长连接时,选择TCP还是HTTP监听直接影响业务兼容性和性能,以下对比表列出两者的核心差异。
| 方案 | 连接保持 | 超时控制 | WebSocket支持 | 适用场景 |
|---|---|---|---|---|
| TCP监听 | 完全透传,ELB不干预 | 由后端控制,ELB仅需设置空闲超时 | 原生支持 | 自定义协议、流媒体、gRPC |
| HTTP监听 | 需开启keep-alive,靠注解控制 | 需分别设置client/backend/keepalive超时 | 需额外注解支持 | 标准HTTP长轮询、REST API长连接 |
在这两种方案中,TCP监听对于长连接更直接,但失去了HTTP层面的路由能力,如果业务需要在Ingress层面做域名或路径分发,HTTP监听仍是首选,但必须仔细配置超时参数。
华为云ELB Ingress长连接设置实操步骤
以华为云ELB Ingress为例,展示如何通过注解配置长连接支持,其他云厂商如阿里云SLB、AWS ELB,虽注解名称不同,但核心思路一致。
创建Ingress时指定注解
使用如下YAML创建Ingress,关键注解用于控制超时和WebSocket支持。

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: long-connection-ingress annotations: kubernetes.io/elb.keepalive_timeout: '300' kubernetes.io/elb.client_timeout: '600' kubernetes.io/elb.backend_timeout: '600' kubernetes.io/elb.support_websocket: 'true' spec: rules: host: example.com http: paths: path: / pathType: Prefix backend: service: name: backend-service port: number: 80
- kubernetes.io/elb.keepalive_timeout:控制空闲超时,单位秒。
- kubernetes.io/elb.client_timeout和kubernetes.io/elb.backend_timeout:分别控制前端和后端超时。
- kubernetes.io/elb.support_websocket:开启WebSocket支持。
修改后端服务组超时时间
如果Ingress已经创建,还可以在ELB控制台直接修改后端服务组的超时参数,进入ELB控制台,找到对应的监听器,调整“后端超时”和“空闲超时”参数,部分云厂商将超时设置放在“后端服务组”层级,需要同步修改后端服务组的超时策略。
验证长连接稳定性
使用curl或websocat工具测试连接保持情况。
# 测试HTTP keep-alive curl -v --keepalive-time 300 http://example.com # 测试WebSocket连接 websocat ws://example.com/ws
观察连接是否在预期时间内保持,以及是否被意外断开,如果连接断开,重点检查超时设置和健康检查策略。

ELB Ingress长连接与WebSocket场景的兼容性
WebSocket是长连接业务的典型代表,ELB Ingress默认可能不支持WebSocket升级,需要显式配置。
如何配置支持WebSocket
在Ingress注解中添加kubernetes.io/elb.support_websocket: 'true',后端服务必须正确响应101状态码,如果使用TCP监听,则不需要额外配置,因为TCP透传自动支持WebSocket。
常见问题排查
- 连接建立失败:检查Ingress注解是否生效,ELB控制台监听器是否开启HTTP2或WebSocket支持。
- 连接意外断开:查看超时设置,确保空闲超时大于业务空闲间隔,如果使用HTTP监听,还需确认keep-alive是否生效。
- 健康检查干扰:改为TCP健康检查,并降低频率,避免健康检查请求误伤长连接。
长连接业务ELB Ingress负载均衡常见问题
Q1: 为什么我的长连接经常断开?
A1: 最常见的原因是ELB空闲超时设置过短,默认超时通常为60秒,对于长连接业务,需要调整为300秒或更高,同时检查后端超时和请求超时,确保它们都支持长连接,如果使用HTTP监听,还需确认keep-alive开启且超时合理。
Q2: WebSocket连接在ELB Ingress下无法建立,怎么解决?
A2: 首先确认Ingress注解中开启了WebSocket支持(如kubernetes.io/elb.support_websocket: true),确保后端服务能够正确响应HTTP升级请求,如果使用TCP监听,则无需额外配置,但需确认后端服务监听正确的端口并支持WebSocket。
Q3: 配置长连接后,健康检查导致连接中断怎么办?
A3: 健康检查会定期发送请求,可能中断空闲连接,建议将健康检查间隔调整到30秒以上,并使用TCP健康检查(而非HTTP),避免干扰长连接,合理设置健康检查的超时和阈值,减少误判,如果业务允许,可以关闭健康检查或使用旁路探测。
合理配置ELB Ingress的长连接参数,是保障实时业务稳定运行的基础,根据业务空闲间隔调整超时时间,并开启必要的功能注解,能有效避免连接中断问题,无论使用华为云还是其他云厂商,核心思路一致:让ELB尽量不干预连接,留给后端足够的控制权。