nginx 实现高性能 tcp 代理需正确启用 stream 模块并遵循其配置规范:该模块非默认开启,须通过 nginx -v 验证或编译时添加 --with-stream;stream 块须与 http 块同级;基础结构含 upstream(支持健康检查)和 server(listen + proxy_pass);负载策略按业务选 least_conn、ip_hash 或加权轮询;关键连接参数包括 proxy_connect_timeout、proxy_timeout 和 proxy_responses;最后用 nginx -t 校验并 systemctl reload nginx 热加载。

Nginx 实现高性能 TCP 代理,核心在于正确启用和使用 stream 模块,它专为四层转发设计,不解析应用层内容,只做连接级路由,因此延迟低、吞吐高。关键不是堆参数,而是理清模块依赖、结构层级、策略选型和连接控制逻辑。
确认并启用 stream 模块
该模块不是默认开启的,必须验证支持状态:
- 运行
nginx -V 2>&1 | grep -o with-stream,有输出说明已编译支持 - 若无输出,需重新编译 Nginx 并添加
--with-stream(Ubuntu/Debian 可安装nginx-full;RHEL/CentOS Stream 9+ 通常自带) -
stream块必须与http块同级,不能嵌套在http内,否则配置加载失败
基础分发结构要写对
最简可用配置包含两个必需部分:定义后端组(upstream)和监听转发(server):
-
upstream中每个server行指定真实后端地址和端口,支持max_fails和fail_timeout实现被动健康检查 -
server块中的listen是 Nginx 对外暴露的端口,proxy_pass必须引用已定义的 upstream 名称 - 默认轮询策略适用于多数短连接场景,无需额外声明;新连接按顺序分配,不考虑后端当前负载
按业务选对负载策略
不同协议和服务特征决定策略选择,错用会放大不均衡:
-
最少连接(
least_conn):适合 Redis、MQTT 等长连接或响应时间波动大的服务,让新连接优先落到当前活跃连接数最少的节点 -
IP 哈希(
hash $remote_addr consistent):用于需会话粘性的场景(如某些数据库连接池),consistent参数可减少后端增减时的哈希重分布冲击 -
加权轮询(
weight=):当后端服务器性能差异明显(如 CPU 核心数不同),通过权重调节流量比例,避免弱机过载
连接行为参数不可忽略
TCP 代理不是“一转了之”,空闲连接、建连超时、转发超时直接影响稳定性:
-
proxy_connect_timeout 1s:限制 Nginx 连接后端的最大等待时间,设太长会导致客户端长时间卡顿,建议 1–3 秒 -
proxy_timeout 30s:控制空闲连接最大存活时长,避免大量僵尸连接耗尽文件描述符,值应略大于业务最长空闲间隔 -
proxy_responses 1(可选):对仅需一次响应的协议(如 DNS over TCP),可限制最多转发 1 次响应后关闭连接
配置完成后用 nginx -t 校验语法,再执行 systemctl reload nginx 热加载——这样不会中断已有 TCP 连接。不复杂但容易忽略。











