Nginx Stream模块是处理海量TCP流量的轻量高效方案,需编译时启用--with-stream、配置与http同级、合理设置upstream(支持least_conn等算法)、超时参数及系统级连接优化。

配置四层负载均衡来处理海量 TCP 流量,关键在于选对组件、精简路径、保障连接稳定性,而不是堆功能。Nginx 的 stream 模块是当前最常用且轻量高效的方案,尤其适合 MySQL、Redis、自定义协议服务等场景。
确认 Nginx 已启用 stream 模块
编译安装时必须带上 --with-stream 参数;若用包管理器安装(如 yum 或 apt),需额外安装 nginx-module-stream 并在主配置中显式加载:
- 检查是否支持:运行
nginx -V 2>&1 | grep -o with-stream,有输出即表示已编译支持 - Debian/Ubuntu:安装
nginx-module-stream后,在/etc/nginx/nginx.conf开头添加load_module modules/ngx_stream_module.so; - CentOS/RHEL:启用模块后需在
stream块外确保模块路径正确,避免启动失败
编写 stream 配置块(非 http 块内)
stream 是与 http 同级的顶层块,不能嵌套在 http 内。典型结构如下:
- 定义 upstream:指定后端 TCP 服务器列表,支持
weight、max_fails、fail_timeout等健康探测参数 - 配置 server:监听公网端口(如
listen 3306;),设置超时(proxy_timeout 30s;)、连接超时(proxy_connect_timeout 1s;) - 开启日志:使用
log_format和access_log记录连接级信息,便于排查连接抖动或异常断连
示例节选:
stream {
log_format basic '$remote_addr [$time_local] $protocol $status $bytes_sent $bytes_received $session_time';
access_log /var/log/nginx/tcp-access.log basic;
<pre class='brush:php;toolbar:false;'>upstream db_backend {
server 192.168.10.10:3306 weight=3 max_fails=2 fail_timeout=10s;
server 192.168.10.11:3306 weight=2;
least_conn; # 连接数最少优先
}
server {
listen 3306;
proxy_pass db_backend;
proxy_timeout 60s;
proxy_responses 1; # 单连接只转发一次响应(可选)
}}
优化连接处理能力
面对海量 TCP 连接,仅配对后端不够,还需调操作系统和 Nginx 本身参数:
- 提升系统文件描述符上限:修改
/etc/security/limits.conf,为 nginx 用户设置nofile至 100000+,并确保 systemd service 中未覆盖该限制 - 调整内核网络参数:增大
net.core.somaxconn(如设为 65535)、启用net.ipv4.tcp_tw_reuse加快 TIME_WAIT 回收 - Nginx worker 配置:设置
worker_processes auto;和worker_rlimit_nofile 100000;,配合events { use epoll; worker_connections 65535; }
验证与可观测性要点
上线前不只看“能否连通”,更要确认连接行为符合预期:
- 用
ss -tn state established | wc -l查看活跃连接数,对比 Nginx 日志中的$session_time判断长连接保持效果 - 模拟后端宕机:停掉一台 upstream 服务器,观察 Nginx 是否在
fail_timeout后自动剔除,并在日志中记录upstream timed out或connection refused - 压测时关注
nginx -t无误后,用ab或wrk(TCP 模式)发起并发连接,避免仅测 HTTP 接口掩盖真实瓶颈

















