nginx stream模块实现四层代理高可用的核心是稳定转发、故障自动隔离、连接保活与合理负载分发协同;它不替代后端数据库高可用机制,而是作为前置通道确保客户端可靠触达健康节点。

确保模块启用与配置合规
高可用的前提是配置能跑起来:
- 运行
nginx -V 2>&1 | grep with-stream,有输出才表示模块已编译支持;若无,Ubuntu/Debian 推荐装nginx-full,CentOS/RHEL 需安装nginx-mod-stream或源码加--with-stream编译 -
stream { }必须和http { }平级,不能嵌套在 http 内,否则启动报错unknown directive "stream" - 主配置顶部建议显式加载:
load_module modules/ngx_stream_core_module.so;(部分版本必需)
用被动健康检查快速剔除故障节点
Stream 层没有主动发 PING 的能力,但支持基于连接失败的被动检测:
- 在
upstream中为每个后端设置max_fails=3 fail_timeout=30s:连续 3 次建连失败(如拒绝连接、超时),就将该节点标记为不可用,30 秒内不再转发请求 - 配合
proxy_responses 1:等待后端返回第一个响应包再认为连接建立成功,避免端口监听了但服务未就绪导致误判 - 可加
backup标记备用节点,仅当所有主节点都失败时才启用,适合灾备场景
长连接不断连:so_keepalive 与 proxy_timeout 协同
MySQL、Redis 等典型长连接服务,最怕中间网络设备(如 NAT 网关、防火墙)静默断连:
-
listen 3306 so_keepalive=300s:15s:4;:空闲 5 分钟后开始 TCP keepalive 探测,每 15 秒一次,连续 4 次无响应则断开 -
proxy_timeout 1h;:设为 ≥ keepalive 总探测耗时(300 + 15×4 = 360 秒),避免 Nginx 自己先关连接 - 二者配合,既防中间链路断连,又保应用层逻辑不受干扰
负载策略适配业务特性
四层负载均衡按连接粒度分发,不是按请求,选对策略很关键:
-
least_conn:适合连接生命周期长、各节点处理能力差异大的场景(如数据库读写混合负载) -
hash $remote_addr consistent;:客户端 IP 一致性哈希,保证同一客户端始终打到同一后端,适用于需会话粘性的部署(如某些 Redis 主从读写分离) - 避免用
round_robin(默认)在长连接场景下造成负载倾斜——一个连接可能持续数小时,新连接不会均摊过去











