文章内容
一、TCP转发
1、单节点转发
最简单的TCP转发配置:
1 2 3 4 5 6 7 | stream{ server{ listen 443; #如果不指定协议的话默认是TCP协议 proxy_pass 1.1.1.1:443; } } |
注意:这里Stream模块的配置与一般的web配置是不一样的。可以很明显的看出来stream是一块自己独立的配置列。
当然Stream模块能详细配置的东西还非常多,例如stream模块还支持sock数据交换接口,所以还可以这样写:
1 2 3 4 5 6 7 | stream{ server{ listen 443; #如果不指定协议的话默认是TCP协议 proxy_pass unix:/tmp/mysql.sock; #只是举例别乱填 } } |
实际上Stream模块在对TCP协议的转发上还支持很多配置参数:
01 02 03 04 05 06 07 08 09 10 | stream{ server{ listen 443; #如果不指定协议的话默认是TCP协议 proxy_pass 1.1.1.1:443; proxy_connect_timeout 10s; #连接超时时间上限 proxy_timeout 20s; #在没有数据传输的情况下,多久之后关闭连接 proxy_buffer_size 512k; #设置用于读取被反代目标的数据缓冲区大小 } } |
很明显的发现,stream模块的配置其实跟HTTP模块很类似。但实际上stream模块与http模块上完全是两套不同的处理流程。用最简单的说法就是,HTTP模块是基于Layer7层的应用层处理流程,而Stream仅在Layer4层上对连接进行处理。所以stream模块无法像HTTP模块那样能区分vhost主机名(然而这Stream模块在引入了ssl配置之后又能支持了,这个后面再说。)。在理论上,stream模块的端口转发效率实际上相比HTTP模块的反向代理效率更高。虽然这两个是完全不能同概而论的东西。
2、负载转发
stream模块支持upstream负载均衡配置,以下是使用了负载均衡的示例:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 | stream{ upstream mysql_upstreams{ hash $remote_addr consistent; #负载均衡一致性hash算法 server 192.168.0.2:3306 weight=1 max_fails=1 fail_timeout=10s; # weight为轮询权重 max_fails最大失败尝试次数 server 192.168.0.3:3306 weight=1 max_fails=1 fail_timeout=10s; # fail_timeout 失败时间 server 192.168.0.3:3306 weight=1 max_fails=1 fail_timeout=10s backup; #backup标记为备用服务器 } server{ listen 3306; #如果不指定协议的话默认是TCP协议 proxy_pass mysql_upstreams; proxy_connect_timeout 10s; #连接超时时间上限 proxy_timeout 20s; #在没有数据传输的情况下,多久之后关闭连接 proxy_buffer_size 512k; #设置用于读取被反代目标的数据缓冲区大小 } } |
同样,Stream模块的TCP连接同样能设置keepalive来保持长连接。例子:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 | stream{ upstream mysql_upstreams{ hash $remote_addr consistent; server 192.168.0.2:3306 weight=1 max_fails=1 fail_timeout=10s; server 192.168.0.3:3306 weight=1 max_fails=1 fail_timeout=10s; server 192.168.0.4:3306 weight=1 max_fails=1 fail_timeout=10s backup; } server{ listen 3306 so_keepalive=30m::10; # listen 3306 so_keepalive=on; 这个是启用keepalive使用默认参数的配置 # keepalive的可配置参数差不多有以下几个:keepidle,keepintvl,keepcnt # keepidle 为连接保持时间,keepintvl 为连接的间隔时间, keepcnt是连接的个数。 # 所以实际配置的格式为 so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt] proxy_pass mysql_upstreams; proxy_connect_timeout 10s; proxy_timeout 20s; proxy_buffer_size 512k; } } |
Stream模块还能引入ssl/tls来对TCP连接进行加密。由于TLS标准内对SNI提供了支持,所以又能识别主机名了。详细使用可以查看nginx的官方文档。
二、UDP转发
UDP转发并不是stream模块一开始就支持的,而是在1.9.3版本之后的stream模块才追加了UDP转发支持。
最简单的UDP转发例子:
1 2 3 4 5 6 7 | stream{ server{ listen 53 udp; proxy_pass 1.1.1.1:53; } } |
当然,UDP转发也一样支持upstream负载均衡。然而由于UDP协议的特性,很多TCP转发上的参数是无法使用的。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 | stream{ upstream dns_upstreams{ server 1.1.1.1:53 weight=1; server 1.0.0.1:53 weight=1; # weight 负载均衡权重 server 8.8.8.8:53 weight=1 backup; #backup标记为备用服务器 } server{ listen 53 udp; proxy_pass dns_upstreams; proxy_responses 1; # nginx版本1.9.13版本以上支持的参数。UDP协议专用,期望后端返回给客户端数据包的数量 proxy_timeout 20s; # 超时时间 } } |
Pingback: Linux下Nginx转发TCP/UDP(替代rinetd) – 梓潼