Nginx stream模块可实现高性能TCP/UDP四层负载均衡,需编译时启用--with-stream、配置独立stream块、设置upstream与server,并注意不支持SSL终止和七层路由等限制。

要用 Nginx 的 stream 模块实现 TCP/UDP 四层负载均衡,关键在于启用模块、正确配置 stream 上下文,并确保后端服务可被直接访问。它不解析应用层内容,只基于 IP 和端口转发,因此性能高、延迟低,适合数据库、游戏、IoT 等场景。
确认并启用 stream 模块
该模块从 Nginx 1.9.0 起引入,但默认不编译进二进制文件,需手动开启:
- 重新 configure 时添加
--with-stream参数(如已有线上环境,建议先在从机平滑升级) - 执行
make(注意:不要make install,避免覆盖配置和二进制) - 用
nginx -V 2>&1 | grep -o with-stream验证是否已启用 - 若已运行旧版 Nginx,需替换
nginx二进制文件并重载(nginx -s reload)
编写 stream 块配置
stream 是与 http 同级的顶级块,不能嵌套在 http 内。典型结构如下:
- 定义
upstream组,列出后端真实服务地址(IP:PORT),支持权重、max_fails、fail_timeout 等健康检查参数 - 用
server块监听客户端连接端口(如 3306、53、8443),并指定proxy_pass到 upstream 名称 - 可设置
proxy_timeout、proxy_responses、proxy_buffer_size等代理行为参数 - UDP 场景需显式声明
udp协议(listen 53 udp;),且每个 server 块仅支持一种协议
支持健康检查与连接管理
stream 模块原生支持基础健康检查,无需额外模块:
-
max_fails=3 fail_timeout=30s可自动剔除连续失败的节点 - 搭配
health_check指令(需 1.11.5+)可启用主动探测,例如定期发 TCP SYN 或自定义数据包 - 使用
proxy_protocol on;可透传客户端真实 IP(要求下游服务支持 PROXY 协议) - 对长连接场景,可通过
proxy_timeout和proxy_responses控制空闲超时与响应数限制
常见注意事项与避坑点
实际部署中容易忽略但影响稳定性的问题:
- stream 不支持 SSL 终止(不像 http 模块有 ssl_certificate),TLS 流量只能透传;如需卸载 TLS,得用七层或前置 TLS proxy
- 不能基于 URL、Header、Cookie 路由——这是四层的本质限制,不是配置问题
- upstream 中各 server 的端口必须明确指定,不能省略;协议由 listen 指令统一决定,不可为每个 server 单独设协议
- UDP 转发时,单个请求-响应周期内不保证顺序,也不维护连接状态,适合 DNS、Syslog、MQTT 等无状态协议











