- TCP四层负载均衡是依据请求连接的。新来一个连接才会轮训,否则不会进行负载均衡策略。因为每一个TCP连接是长连接,不能像HTTP七层负载均衡一样,来一个信息,就进行负载均衡策略
- 我们之前的nginx负载均衡都是七层负载均衡,基于HTTP(应用层),这节课我们讲的是基于TCP(四层负载均衡),简单说我们这节课讲的负载均衡都是基于Socket实现的(Socket就是基于TCP实现的)。
- nginx在1.9之前是不支持TCP四层负载均衡以及反向代理的,在1.9之前是使用LVS,F5等实现四层负载均衡的
- LVS是基于四层传输的(TCP),而Nginx是基于Http协议进行反向代理和负载均衡的。
- Nginx的七层负载均衡是基于应用层的Http的负载均衡,四层负载均衡是基于传输层TCP协议的负载均衡
- 四层负载均衡:
- 区别:
(1)Nginx的四层负载均衡(基于TCP)使用长连接的方式,只要客户端与服务端保持连接,nginx就不会轮训到下一台服务器上去,只有来一个新连接的时候,才会进行轮训。
(2)Nginx的七层负载均衡(基于HTTP)每发送一次新的数据,就会轮训到下一台服务器上去。
网络模型知识回顾
-
七层网络主要关注应用层(HTTP)和传输层(TCP)
-
服务器与服务器之间的通信必须需要IP地址+端口号
(1)IP地址分为局域网和外网
(2)端口号:用来区分不同的应用程序 -
TCP与UDP的区别
- UDP:
(1)是面向无连接的(对方是否在线我不管,直接发送就行),将数据以及源的封装成数据包,不需要建立连接
(2)每个数据报的大小限制在64k以内
(3)因不需要建立连接,所以是不可靠协议(可能发生丢包)
(4)不需要建立连接,速度快- TCP
(1)建立连接,形成传输数据的通道
(2)在连接中进行大数据量的传输,以字节流的方式
(3)通过三次握手完成连接,是可靠的协议(不会发生丢包,三次握手确定了对方在线,不丢包,安全可靠)
(4)必须建立连接,所以效率比UDP差
- 三次握手:
简单来说就是:
(1)在吗?
(2)在!
(3)好!
这时候就确认对方在线,连接通道建立,可以发送数据
HTTP协议
- HTTP协议是一种超文本传输协议,他的底层是基于TCP协议封装的,HTTP协议是属于应用层的协议
- HTTP协议主要由请求和响应组成的。
- HTTP协议的请求分为请求参数和方法类型,请求头,请求体;响应分为响应状态,响应头,响应体等。
- HTTP协议是同步方式。
安装环境(Linux)
- 注意:我们的nginx一定要是1.9以上的。
- 实现的效果
- 下载安装包
(1)下载nginx
wget http://nginx.org/download/nginx-1.9.10.tar.gz
(2)下载nginx_tcp_proxy_module插件
wget https://github.com/yaoweibin/nginx_tcp_proxy_module/tarball/master
(3)解压插件
tar -zxvf master
(4)解压nginx
tar -zxvf nginx-1.9.10.tar.gz
(5)进入nginx目录
cd nginx-1.9.10
(6)下载tcp.patch的最新补丁
patch -p1 < …/yaoweibin-nginx_tcp_proxy_module-b8a3028/tcp.patch
如果报错:
-bash: patch: 未找到命令 执行 yum -y install patch 安装即可。
(7)编译Nginx
./configure --add-module=…/yaoweibin-nginx_tcp_proxy_module-121c026
(8)make && make install
make && make install
如果报错
In file included from …/nginx_tcp_proxy_module-master/ngx_tcp.h:32,
from …/nginx_tcp_proxy_module-master/ngx_tcp.c:5:
…/nginx_tcp_proxy_module-master/ngx_tcp_upstream.h:144: error: expected specifier-qualifier-list before ‘ngx_resolver_addr_t’
make[1]: *** [objs/addon/nginx_tcp_proxy_module-master/ngx_tcp.o] Error 1
make[1]: Leaving directory `/opt/apps_install/nginx-1.9.9’
make: *** [build] Error 2
修改第三方模块包里的头文件,ngx_tcp_upstream.h 144 行将ngx_resolver_addr_t 改为 ngx_addr_t
Cd /usr/local/yaoweibin-nginx_tcp_proxy_module-121c026
Vi ngx_tcp_upstream.h
(9)继续 make && make install
(10)修改nginx.conf的配置文件
### 修改为TCP模块
tcp {
### 定义多个上游服务器
upstream itmayeidu{
### 定义TCP模块上游服务器
server 192.168.5.165:80001;
server 192.168.5.165:80002;
}
server {
listen 9999;
server_name 192.168.212.137;
### 反向代理upstream
proxy_pass itmayeidu;
}
}
(7)启动Nginx
(8)创建两个Socket服务器端,因为Socket其实就是依据TCP实现的,这里省略Socket的服务器端程序,就是最基本的两个
(9)Nginx连接反向代理TCP服务器