K8s Nginx Ingress TCP流:上游断开时维持客户端连接
TCP负载均衡下维持客户端长连接的Nginx Ingress配置调整
你当前的配置未覆盖上游服务主动断开的触发场景,且缺少维持客户端与Nginx之间长连接的关键参数,导致上游断开时客户端连接同步终止。以下是修正后的配置及关键说明:
修正后的Nginx Server配置
server { preread_by_lua_block { ngx.var.proxy_upstream_name="tcp-my-namespace-my-service-7550"; } listen 7550; # 开启客户端与Nginx之间的TCP保活,维持长连接 proxy_socket_keepalive on; # 设置客户端连接超时为极大值,满足"绝不关闭"需求(可按需调整) proxy_timeout 86400s; # 控制Nginx连接新上游的超时时间 proxy_connect_timeout 10s; # 明确指定触发上游重试的场景,包含上游主动断开 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 closed; proxy_next_upstream_timeout 600s; proxy_next_upstream_tries 3; proxy_pass upstream_balancer; }
核心参数解释
proxy_socket_keepalive on:启用Nginx与客户端之间的TCP保活机制,避免Nginx主动断开客户端连接,同时能检测客户端存活状态。proxy_timeout 86400s:将客户端连接超时设为1天(可根据业务需求调至更大值),防止Nginx因超时而主动终止长连接。proxy_next_upstream补充closed参数:当上游服务主动关闭连接时,触发Nginx重新选择可用上游节点转发流量,这是你当前配置缺失的核心触发条件。proxy_connect_timeout:限制Nginx连接新上游的超时时间,避免重试过程中阻塞太久。
额外注意事项
- 上游Pod滚动更新时,需配置合理的
terminationGracePeriodSeconds,给Nginx足够时间切换到新Pod,减少流量中断风险。 - 若使用Nginx Ingress Controller的标准TCP配置(而非自定义server块),需通过
ConfigMap或nginx.ingress.kubernetes.io/server-snippet注解注入上述参数(不同版本的Ingress Controller配置方式略有差异)。 - 测试时可手动杀掉单个上游Pod,验证客户端连接是否保持,流量是否自动切换至其他可用节点。
内容的提问来源于stack exchange,提问作者biscuit_cakes
相关产品推荐
相关产品推荐

