nginx通过stream模块实现l4层tcp代理,支持跨地域转发、负载均衡与故障转移;需确认模块启用、配置同级stream块、优化超时/日志/健康检查,并推荐按业务拆分配置文件。

Nginx 通过 stream 模块实现 TCP 代理,是跨地域网络请求转发(如大陆→日本、新加坡→北美)的常用方案。它工作在传输层(L4),不解析应用层协议,只做原样转发,低延迟、高吞吐,适合数据库、游戏服、自定义 TCP 服务等场景。
确认 stream 模块已启用
这是前提,否则配置会报错 unknown directive "stream":
- 运行
nginx -V 2>&1 | grep with-stream,有输出说明已内置支持 - 若无输出:
• Ubuntu/Debian:安装动态模块sudo apt install nginx-mod-stream,并在nginx.conf首行添加load_module /usr/lib/nginx/modules/ngx_stream_module.so;
• CentOS/RHEL:执行yum install nginx-mod-stream或重新编译时加--with-stream - 注意:stream 模块必须与 http 块同级,不能嵌套在 http 内
基础 TCP 转发配置结构
在 /etc/nginx/nginx.conf 文件末尾(与 http 块并列)添加 stream 块:
stream {
upstream db_cluster {
server 192.168.10.5:3306 weight=10;
server 192.168.10.6:3306 backup;
}
<pre class="brush:php;toolbar:false;">server {
listen 3307; # 外网或中转机监听端口
proxy_pass db_cluster;
proxy_timeout 30s;
proxy_responses 1; # 仅用于健康检查场景(可选)
}}
该配置表示:访问本机 :3307 的 TCP 连接,将被原样转发至后端 MySQL 实例,支持简单负载均衡与故障转移。
跨地域场景的关键优化项
针对专线/公网跨域转发(如上海→东京、法兰克福→AWS us-east-1),需关注连接稳定性与可观测性:
-
超时控制:显式设置
proxy_connect_timeout(建议 1–3s)、proxy_timeout(建议 60–300s),避免长连接僵死 -
连接复用与限流:使用
proxy_buffer_size 4k和proxy_buffering on缓冲小包;必要时配合limit_conn防止单 IP 耗尽端口资源 -
日志追踪:启用 stream access log,记录真实客户端 IP、会话时长、上下行字节数,便于排查跨境延迟或丢包
log_format tcp_log '$remote_addr [$time_local] $protocol $status $bytes_sent $bytes_received $session_time';<br>access_log /var/log/nginx/tcp-access.log tcp_log;
-
健康检查(可选):stream 模块原生不支持 HTTP 健康检查,但可通过
tcp_check(需第三方 patch)或外部脚本 +health_check模块(OpenResty)补充
配置分离与维护建议
生产环境推荐按功能拆分配置,提升可读性与可维护性:
- 在主配置中添加
include /etc/nginx/stream.d/*.conf; - 新建目录
mkdir -p /etc/nginx/stream.d,为每个业务建独立文件,例如:/etc/nginx/stream.d/game-jp.conf(转发至东京游戏服)/etc/nginx/stream.d/db-us.conf(转发至 AWS RDS) - 每次修改后执行
nginx -t && nginx -s reload验证并热重载











