Nginx四层负载均衡需协同内核参数与stream模块配置应对半开/僵死连接:启用so_keepalive、调优tcp_keepalive_time/intvl/probes,配置proxy_timeout;系统层开启tcp_syncookies、降低synack_retries;通过upstream被动检查或扩展模块实现主动健康探测。

配置 Nginx 处理四层负载均衡中的 TCP 半开连接(half-open connection)与僵死连接(dead/stale connection),关键在于协同操作系统内核参数、Nginx 的 stream 模块行为控制,以及连接生命周期管理。Nginx 本身不主动发起 TCP 探活,但可通过超时、重试和连接复用策略规避半开/僵死连接带来的资源滞留和转发失败问题。
启用并正确配置 stream 模块处理 TCP 流量
Nginx 的四层代理依赖 stream 上下文(非 http),需确认编译时已启用 --with-stream 模块。基础配置示例如下:
- 在
nginx.conf全局块外层添加stream { ... }块,不能嵌套在http内; - 使用
upstream定义后端 TCP 服务器组,支持max_fails和fail_timeout实现被动健康检查; - 监听端口使用
listen 8001 so_keepalive=on;——so_keepalive启用系统级 TCP keepalive,是检测僵死连接的第一道防线; - 避免遗漏
proxy_timeout类指令:如proxy_timeout 30s;控制空闲连接最大存活时间,超时即断开,防止僵死连接长期占用连接槽。
调优系统级 TCP keepalive 参数
Nginx 的 so_keepalive 依赖内核的 TCP keepalive 机制,需同步调整 Linux 系统参数(通常写入 /etc/sysctl.conf):
-
net.ipv4.tcp_keepalive_time = 600:连接空闲 600 秒后开始发送探测包; -
net.ipv4.tcp_keepalive_intvl = 60:每次探测间隔 60 秒; -
net.ipv4.tcp_keepalive_probes = 3:连续 3 次无响应则判定连接失效并关闭; - 搭配
so_keepalive=on使用时,Nginx 会继承这些值;若需为某监听单独定制,可用so_keepalive=on:600:60:3格式显式指定。
识别并缓解半开连接(SYN_RECV 状态堆积)
半开连接本质是三次握手未完成,多见于 SYN Flood 攻击或客户端异常中断。Nginx stream 层不直接处理 SYN 包,因此防护需前置到系统层:
- 启用 SYN Cookie:
net.ipv4.tcp_syncookies = 1,在连接队列满时用加密序列号代替存储连接状态; - 缩短 SYN-ACK 重试次数:
net.ipv4.tcp_synack_retries = 3(默认 5),加快释放无效等待; - 减小半连接队列长度:
net.ipv4.tcp_max_syn_backlog = 2048,配合防火墙限速更有效; - Nginx 侧可配合
proxy_responses 1;+proxy_timeout防止因后端响应慢导致连接卡在 ESTABLISHED 但无数据交换的状态。
补充:主动健康检查与故障隔离
stream 模块原生不支持主动心跳检测(如 HTTP 的 health_check),但可通过以下方式增强可靠性:
- 使用
nginx_upstream_check_module(需重新编译)增加 TCP 端口连通性探测,支持check interval=3 rise=2 fall=3等策略; - 在
upstream中设置server 192.168.1.10:3306 max_fails=2 fail_timeout=10s;,让 Nginx 在连续失败后临时摘除节点; - 结合外部工具(如 consul-template 或自定义脚本)动态更新 upstream 配置并热重载,实现更灵敏的节点上下线感知。


















