帮助中心 >  技术知识库 >  云服务器 >  服务器教程 >  Nginx 四层代理 stream 模块实战:TCP/UDP 转发与负载均衡优化

Nginx 四层代理 stream 模块实战:TCP/UDP 转发与负载均衡优化

2026-05-07 17:05:17 1475

Nginx 四层代理 stream 模块实战:TCP/UDP 转发与负载均衡优化

欢迎来到蓝队云技术小课堂,每天分享一个技术小知识。

很多运维只会用 Nginx 做 HTTP 反向代理,但在生产环境里,Nginx 的 stream 模块更适合处理:

· MySQL

· Redis

· MQTT

· TCP 游戏服务

· UDP 服务

甚至可以替代部分 LVS 场景。




确认 Nginx 是否支持 stream:

nginx -V 2>&1 | grep stream

如果存在:

--with-stream

说明已经启用。




最基础 TCP 转发:

stream {

 

    upstream mysql_backend {

        server 10.0.0.11:3306;

        server 10.0.0.12:3306;

    }

 

    server {

        listen 3306;

        proxy_pass mysql_backend;

    }

}

客户端直接连接:

mysql -h nginx-ip -P 3306 -uroot -p

即可通过 Nginx 转发到后端 MySQL。




默认情况下:

stream 使用轮询负载均衡

但数据库场景通常不适合轮询。




更合理的是:

upstream mysql_backend {

    hash $remote_addr consistent;

 

    server 10.0.0.11:3306;

    server 10.0.0.12:3306;

}

实现:

客户端 IP 固定落到同一后端

避免会话漂移。




Redis 场景更适合:

least_conn;

配置:

upstream redis_backend {

 

    least_conn;

 

    server 10.0.0.21:6379;

    server 10.0.0.22:6379;

}

减少热点节点压力。




stream 最大价值之一:

四层代理性能远高于七层 HTTP

因为:

· 不解析 HTTP

· 不处理 Header

· 无复杂规则匹配

CPU 消耗极低。




生产环境必须开启连接复用:

proxy_timeout 10m;

proxy_connect_timeout 5s;

否则高并发下容易:

TIME_WAIT 爆炸




查看连接状态:

ss -ant | grep 3306

重点关注:

ESTAB

TIME_WAIT

CLOSE_WAIT




大量:

TIME_WAIT

通常意味着:

· 短连接过多

· upstream 未复用

· 客户端连接池配置错误




stream 支持健康检查,但开源版功能有限。

企业里常见方案:

keepalived + nginx stream

实现高可用。




例如:

server {

    listen 6379;

    proxy_pass redis_backend;

 

    proxy_timeout 3s;

    proxy_connect_timeout 1s;

}

Redis 节点异常:

连接快速失败

避免客户端长时间阻塞。




UDP 转发也支持:

stream {

 

    upstream dns_backend {

        server 10.0.0.53:53;

    }

 

    server {

        listen 53 udp;

        proxy_pass dns_backend;

    }

}

适用于:

· DNS

· 游戏 UDP 服务

· 语音服务




stream 日志默认不开启。

生产建议:

log_format stream_log '$remote_addr [$time_local] '

                      '$protocol $status $bytes_sent $bytes_received '

                      '$session_time';

 

access_log /var/log/nginx/stream.log stream_log;

否则出了问题很难排查。




连接数优化:

worker_processes auto;

 

events {

    worker_connections 65535;

}

同时调整系统参数:

sysctl -w net.core.somaxconn=65535

sysctl -w net.ipv4.ip_local_port_range="1024 65535"




高并发 TCP 代理场景里:

内核参数比 Nginx 配置更重要




很多人误以为:

Nginx 只能做 Web 服务

实际上:

· 四层代理

· TCP 负载均衡

· UDP 转发

· 数据库入口统一

· Redis 代理

都是 stream 的核心使用场景。




线上经验:

Nginx stream 更适合作为“轻量级四层网关”

尤其在中小规模集群中:

· 配置简单

· 性能稳定

· 运维成本低

HAProxy 更容易维护。

蓝队云官网上拥有完善的技术支持库可供参考,大家可自行查阅,更多技术问题,可以直接咨询。同时,蓝队云整理了运维必备的工具包免费分享给大家使用,需要的朋友可以直接咨询。

更多技术知识,蓝队云期待与你一起探索。

 

 


提交成功!非常感谢您的反馈,我们会继续努力做到更好!

这条文档是否有帮助解决问题?

非常抱歉未能帮助到您。为了给您提供更好的服务,我们很需要您进一步的反馈信息:

在文档使用中是否遇到以下问题: