Nginx TCP代理精准路由需依托stream模块,通过map基于客户端IP或SNI动态选择upstream,配合健康检查、fallback机制及日志溯源实现稳定可控的四层调度。

在 Nginx 中实现 TCP 代理的请求流量精准路由,核心是利用 stream 模块配合变量、条件判断与动态 upstream 选择,而非仅靠静态轮询或 least_conn。它不解析应用层内容(如 HTTP header 或 URL),但可通过客户端 IP、端口、SNI、甚至自定义协议特征做四层层面的精细调度。
基于客户端 IP 实现分组路由
这是最常用且稳定的精准路由方式,适合按地域、网络段或白名单分流:
- 使用
map指令预定义 IP 到后端组的映射关系(注意:map 必须定义在stream块外、全局作用域) - 例如:
map $remote_addr $backend_group { default "default_backend"; 192.168.10.0/24 "shanghai_backend"; 10.20.30.40 "vip_backend"; ~^172\.1[6-9]\. "internal_backend"; } - 在
server块中通过proxy_pass引用该变量:upstream shanghai_backend { server 192.168.1.100:3306; } upstream vip_backend { server 192.168.1.200:3306; } upstream default_backend { server 192.168.1.10:3306; } <p>server { listen 3306; proxy_pass $backend_group; }
基于 SNI 实现 TLS 流量智能分发
当代理的是 HTTPS、MQTT over TLS 或其他带 SNI 的 TCP 服务时,Nginx 可提取 SNI 字段做路由决策:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 启用
ssl_preread模块(需编译时含--with-stream_ssl_preread_module) - 在
stream块中开启 ssl_preread:server { listen 443 ssl; ssl_preread on; proxy_pass $upstream_by_sni; } - 用 map 提取并匹配 SNI:
map $ssl_preread_server_name $upstream_by_sni { default backend_default; api.example.com backend_api; admin.example.com backend_admin; } - 此方式无需终止 TLS,保持端到端加密,同时实现域名级路由
结合健康检查与 fallback 机制
精准路由不只是“分得准”,更要“切得稳”——确保目标不可用时有兜底策略:
- 每个 upstream 都可配置
max_fails和fail_timeout,自动剔除异常节点 - 对关键业务组启用
health_check(TCP 场景支持 TCP 握手探测;UDP 需搭配match自定义响应校验) - 设置默认 fallback:当 map 匹配结果为空或所有 upstream 不可用时,可强制指向一个降级组或返回拒绝连接(用
return 503需配合 stream_return 模块) - 示例 fallback 配置:
upstream fallback { server 127.0.0.1:3307; # 本地降级 DB # 不启用健康检查,仅作兜底 } <p>server { listen 3306; proxy_pass $backend_group; proxy_next_upstream error timeout; proxy_next_upstream_tries 2; }
支持热更新与日志溯源
生产环境要求路由规则可动态调整,且每次转发行为可追溯:
- 将
map规则单独存为/etc/nginx/stream.d/routing.map,通过include引入,修改后 reload 即生效 - 开启 stream 日志:
log_format stream_log '$remote_addr [$time_local] $protocol $status $bytes_sent $bytes_received $upstream_addr'; access_log /var/log/nginx/stream_access.log stream_log;
- 日志中
$upstream_addr能明确记录实际转发的目标地址,便于排查路由是否符合预期 - 配合 Prometheus + nginx-vts-exporter 或自研 exporter,可监控各 upstream 的连接数、失败率、延迟等指标


















