听说你的应用还需要额外装一堆中间件来做四层代理?Nginx的Stream模块表示很委屈~
01 为什么需要Nginx Stream模块?
在现代应用架构中,四层负载均衡的需求无处不在。无论是数据库集群、消息队列还是自定义的TCP/UDP服务,都需要一个高效、可靠的代理机制。
在Nginx 1.9.0之前,我们通常需要依赖LVS、HAProxy或者各种中间件(如MyCat)来实现这一功能。
这就好比明明一辆卡车就能运完的货物,却非得找来三辆小轿车,既浪费资源又增加维护成本。
2015年,Nginx 1.9.0发布了Stream模块,正式支持四层协议的代理和负载均衡。这意味着我们终于可以用统一的工具来解决七层和四层的代理需求了!
与内核态转发的LVS相比,Stream模块在应用层实现代理,需要与客户端和服务器分别建立socket连接,在性能和效率上有一定差距。但对于大多数场景来说,它已经足够强大,而且配置更加灵活简便。
Stream模块的核心价值在于:
- 统一技术栈,降低运维复杂度
- 配置简单直观,学习成本低
- 支持丰富的负载均衡算法
- 可以与Nginx现有的认证、日志等模块结合使用
02 Stream模块基础:从概念到配置
什么是Stream模块?
Nginx的Stream模块是一个专门处理TCP和UDP流量转发的核心模块。它允许Nginx作为反向代理和负载均衡器,工作在传输层(四层),而不只是应用层(七层)。
可以把Stream模块想象成一个聪明的邮局分拣员,他不需要知道信封里具体写了什么(应用层数据),只需要根据信封上的地址信息(四层数据)就能决定把信件投递到哪个邮局。
编译与启用
默认情况下,Stream模块不会自动编译到Nginx中,需要在编译时显式启用:
./configure --with-stream
make && make install
确认Stream模块是否已安装:
nginx -V 2>&1 | grep -o with-stream
基础配置结构
Stream模块的配置与HTTP模块平行,需要在nginx.conf中的main上下文中定义:
# 主配置文件nginx.conf
events {
worker_connections 1024;
}
# HTTP模块(七层代理)
http {
server {
listen 80;
# ... HTTP相关配置
}
}
# Stream模块(四层代理)
stream {
upstream backend {
server backend1.example.com:12345;
server backend2.example.com:12345;
}
server {
listen 12345;
proxy_pass backend;
}
}
注意:Stream块必须与events和http块同级,不能嵌套在http块内。
03 核心配置指令详解
监听指令:listen
listen指令定义了Nginx监听的地址和端口,以及相关的套接字选项:
server {
listen 127.0.0.1:12345; # 监听特定IP和端口
listen *:12345; # 监听所有IPv4地址的12345端口
listen 12345; # 同上,等同于*:12345
listen [::1]:12345; # 监听IPv6地址
listen [::]:12345; # 监听所有IPv6地址
listen unix:/var/run/nginx.sock; # 监听UNIX域套接字
# 参数示例
listen 12345 udp reuseport; # UDP协议,重用端口
listen 12345 ssl; # 启用SSL/TLS
listen 12345 proxy_protocol; # 支持PROXY协议
}

最低0.47元/天 解锁文章
1578

被折叠的 条评论
为什么被折叠?



