Nginx Stream模块实现高性能TCP四层代理需启用--with-stream编译选项、配置顶层stream块、合理设置proxy_timeout/proxy_responses/so_keepalive及缓冲参数,并调优系统内核与worker连接数。

要在 Nginx 中用 Stream 模块实现高性能 TCP 四层反向代理,核心是启用 stream 上下文、正确配置监听与上游,并确保底层网络和系统参数适配高并发场景。Nginx 的 Stream 模块从 1.9.0 开始稳定支持,但需编译时显式启用(--with-stream),默认不包含在多数发行版的预编译包中。
确认 Stream 模块已启用
运行以下命令验证:
nginx -V 2>&1 | grep -o with-stream
若无输出,说明未启用。Ubuntu/Debian 用户可安装 nginx-full 包(含 stream 支持);CentOS/RHEL 需自行编译或使用官方仓库的 nginx-plus 或 EPEL 中的完整版。Docker 用户建议使用 nginx:alpine 或官方 nginx:mainline 镜像(均默认启用 stream)。
基础 TCP 反向代理配置结构
Stream 配置独立于 HTTP 配置,需在主配置文件(如 /etc/nginx/nginx.conf)顶层添加 stream 块,不能嵌套在 http 内:
- 使用
stream { ... }定义全局 stream 上下文 - 每个服务用
server { ... }声明监听地址+端口 - 用
proxy_pass指向 upstream,不支持 rewrite、header 修改等 HTTP 层功能 - 支持
upstream块定义后端组,可配置负载均衡策略(least_conn、hash $remote_addr等)
示例(代理 Redis 流量到集群):
stream {
upstream redis_backend {
hash $remote_addr consistent;
server 10.0.1.10:6379 max_fails=3 fail_timeout=30s;
server 10.0.1.11:6379 max_fails=3 fail_timeout=30s;
}
<pre class="brush:php;toolbar:false;">server {
listen 6379;
proxy_pass redis_backend;
proxy_timeout 1s;
proxy_responses 1;
# 启用连接复用(需后端支持)
proxy_buffer_size 128k;
}}
关键性能调优参数
四层代理性能高度依赖连接处理效率和内核参数:
-
proxy_timeout:设为合理值(如 1–5 秒),避免长连接阻塞 worker 进程 -
proxy_responses:对单请求单响应协议(如 Redis PING/RESP),设为1可提前关闭连接 -
so_keepalive=on(在listen指令中):启用 TCP keepalive,防止中间设备断连 -
worker_connections在 events 块中设为 65536+,并配合use epoll;(Linux) - 系统级优化:增大
net.core.somaxconn、net.ipv4.ip_local_port_range,降低net.ipv4.tcp_fin_timeout
健康检查与日志可观测性
Stream 模块原生不支持 HTTP 健康检查,但可通过以下方式增强可靠性:
- 使用
health_check interval=3000 rise=2 fall=3(Nginx Plus 功能,开源版不可用) - 开源替代:搭配
tcp_check脚本 + systemd timer 或 consul health check - 开启 stream 日志:
log_format proxy '[$time_local] $protocol $status $bytes_sent $bytes_received $session_time';,再在 server 块中用access_log /var/log/nginx/stream.log proxy; - 监控指标建议采集:活跃连接数(
nginx_stub_status不适用,需用nginx-module-vts或 Prometheus Exporter)



















