如何利用 proxy_pass 结合 stream 模块实现四层 TCP/UDP 协议转发

老静姑娘_7441

老静姑娘_7441

2026-05-16

841人浏览

原创

proxy_pass在stream模块中实现四层转发,必须置于stream块内、仅支持ip:port或upstream名、不认协议头或路径;tcp/udp行为不同,且不可混用http模块指令。

如何利用 proxy_pass 结合 stream 模块实现四层 tcp/udp 协议转发

直接用 proxy_pass 实现四层转发,核心就三点:位置对、写法对、协议对。它不走 HTTP 解析,只做连接透传,所以不能套用 http 模块那一套。

proxy_pass 必须写在 stream 块里

stream 是独立于 http 的顶层模块,和 events 并列。把 proxy_pass 放进 http {} 或 server {}(http 下的)里,Nginx 启动会直接报错:unknown directive "proxy_pass" 或 directive is not allowed here。

  • 正确结构是:events { ... } → stream { upstream xxx { ... }; server { listen ...; proxy_pass ...; } } → http { ... }
  • server 块里的 listen 只写端口(如 listen 3306),UDP 要加 udp 标识(如 listen 53 udp)
  • upstream 和 server 都必须定义在 stream 块内,彼此之间不能嵌套

proxy_pass 后面只能跟 IP:PORT 或 upstream 名

它不认协议头,也不解析 URL。写 http://、https://、路径、查询参数,全都会导致启动失败。

FastAPI Flask Proxy
FastAPI Flask Proxy

FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。

下载
  • 正确写法:proxy_pass 192.168.1.10:6379; 或 proxy_pass redis_backend;
  • 如果用域名(比如 proxy_pass db.example.com:3306;),必须提前配好 resolver,否则 DNS 解析失败,连接超时
  • upstream 内部的 server 行也不能带协议,只写 server 10.0.2.5:22 weight=2;

TCP 和 UDP 的 proxy_pass 行为略有不同

TCP 默认建立长连接并透传全部字节流;UDP 是无连接的,每次请求/响应独立,所以需额外控制响应数量和超时。

  • TCP 场景常用:proxy_timeout 1h;(如 MySQL 长连接)、proxy_responses 1;(收到首个响应包即认为连接成功)
  • UDP 场景必须加 udp 标识,且推荐设 proxy_responses 1;,避免客户端重复收包;proxy_timeout 通常设短些(如 1s),适配 DNS 查询等快速交互
  • UDP 不支持健康检查、keepalive、重试等高级策略,靠底层连通性判断可用性

不能用的指令,proxy_pass 也救不了

stream 层没有 request header、body、location、rewrite 这些概念,所有 http 模块专属指令在这里都无效。

  • 写了 proxy_set_header、rewrite、access_log、return,Nginx -t 就会失败
  • 想做 TLS SNI 路由?得靠 ssl_preread on; + $ssl_preread_server_name 变量,但仅限 TLS 握手阶段,不是应用层解析
  • 需要读写分离、SQL 路由、协议解析?stream 做不到,得换 ProxySQL、MaxScale 或 HAProxy

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

3189

3

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

2023.07.25

2308

9

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

2023.08.02

1260

5

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.09

1198

4

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

2023.09.05

1356

5

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2178

7

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

2023.09.20

3480

8

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

2023.09.22

15875

6

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

549

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CentOS 官方文档
CentOS 官方文档

共0课时 | 0人学习

极客学院Java8新特性视频教程
极客学院Java8新特性视频教程

共17课时 | 4.3万人学习