Nginx在1.9.0的时候,增加了一个 stream 模块,用来实现四层协议(网络层和传输层)的转发、代理、负载均衡等。stream模块的用法跟http的用法类似,允许我们配置一组TCP或者UDP等协议的监听,然后通过proxy_pass来转发我们的请求,通过upstream添加多个后端服务,实现负载均衡,下面我们从基础网络模型讲起:
1.网络模型在前面的章节中,我们知道,网络的七层协议是这样的,详细的内容可以参考文章:《网络七层协议,四层协议,五层协议?》:
OSI中的层功能TCP/IP协议族应用层文件传输、电子邮件、文件服务、虚拟终端TFTP、HTTP、SNMP、FTP、SMTP、DNS、RIP、Telnet表示层数据格式化、代码转换、数据加密没有协议会话层接触或建立与别的节点联系没有协议传输层提供端对端的接口TCP、UDP网络层为数据包选择路由IP、ICMP、OSPF、BGP、IGMP、ARP、RARP数据链路层传输有地址的帧以及错误检测功能SLIP、CSLIP、PPP、MTU、ARP、RARP物理层以二进制数据形式在物理媒体上传输数据ISO2110、IEEE802、IEEE802.2说到网络协议,很容易就会抛出一个问题,这些网络服务通过什么机制去实现的?
答:Socket
- Socket就是为网络服务提供的一种机制。
- 通讯的两端都有Sokcet
- 网络通讯其实就是Sokcet间的通讯
- 数据在两个Sokcet间通过IO传输。
既然端对端的网络通讯是通过Socket IO传输的,那么它们是通过什么传输的呢?没错就是通过TCP或者UDP传输的:
UDP:
- 是面向无连接, 将数据及源的封装成数据包中,不需要建立连接。
- 每个数据报的大小在限制64k内。
- 因无连接,是不可靠协议。
- 不需要建立连接,速度快。
TCP:
- 建议连接,形成传输数据的通道。
- 在连接中进行大数据量传输,以字节流方式。
- 通过三次握手完成连接,是可靠协议。
- 必须建立连接效率会稍低。
从网络的七层协议中,可以看到TCP和UDP使用用于传输层的,而HTTP是用于应用层的。可以看出HTTP协议是基于TCP协议封装成超文本传输协议,HTTP分为请求和响应,HTTP协议分为请求参数和方法类型、请求头、请求体,响应分为 响应状态、响应头、响应体等。(HTTP我们常用到,此处就不再详细讲解了)。
到这里,要回归到本文的主题了,本文主要讲解的是如何基于Nginx1.9实现四层负载均衡。
先理解两个概念"四层负载均衡"和"七层负载均衡": 四层负载均衡: 在网络模型中的传输层中,基于主要是基于tcp协议报文实现负载均衡(比如LVS
、haproxy
就是四层负载均衡器),使用改写报文的源地址和目的地址。
七层负载均衡: 在网络模型中应用层中,基于URL或者HTTP协议实现负载均衡,Web服务器。
其它:《Nginx、HAProxy、LVS三者的优缺点》
2.环境安装1.下载Nginx( 作用:实现反向代理、负载负载库)
wget http://nginx.org/download/nginx-1.9.10.tar.gz
2.下载nginx_tcp_proxy_module 插件 (nginx 支持TCP转发和负载均衡的支持)
wget https://github.com/yaoweibin/nginx_tcp_proxy_module/tarball/master
3.解压Nginx
tar -zxvf nginx-1.9.10.tar.gz
4.解压nginx_tcp_proxy_module 插件
tar -zxvf master
5.进入Nginx解压目录,下载tcp.patch最新补丁
cd nginx-1.9.10
patch -p1
关注
打赏