LVS不足:

上文中我们理解并完成了LVS的四层结构,但是LVS还有许多不足:

  • 在大规模网络中应用存在不足:各转发模式,网络拓扑复杂,运维成本高
  • 和商用LB设备相比:缺少TCP标志位DDOS防御攻击
  • 主备部署方式不足:性能无法线性扩展
  • DR模式的不足:1、LVS-RS间必须在同一个VLAN       2、RS上绑定VIP,风险大   3、不支持端口映射
  • NAT模式的不足:所有RS的网关必须指向VS调度器,而在大型网络中所有的RS不一定都能指向VS,所以此时就要设计策略路由,而策略路由的成本较高
  • TUNNEL模式的不足:1、RS配置复杂(IPIP模块等)    2、RS上绑定VIP,风险大

解决方法:

  • LVS各转发模式运维成本高:新转发模式FULLNET,实现LVS—RS间跨VLAN通讯,并且in/out流都经过LVS
  • 缺少攻击防御模块:1、SYNPROXY:synflood攻击防御模块     2、其他TCP、FLAG、DDOS攻击防御策略
  • 性能无法线性扩展:Cluster部署模式

FULLNET的session表使用双向hash,使用五元组作为hash key,即 源地址、源端口、协议、目标端口、目标地址。

一、nginx环境搭建

在nginx官网下载nginx包(nginx: download),下载完成后解压:

nginx四层负载均衡原理 nginx七层负载均衡配置_nginx

 然后进入nginx目录进行编译,可以使用以下操作获取帮助、编译等:

nginx四层负载均衡原理 nginx七层负载均衡配置_运维_02

./configure --help     #查看编译帮助
./configure --with-http_ssl_module --with-http_stub_status_module --prefix=/usr/local/nginx    #编译时安装ssl模块、http监控模块、指定安装路径

在编译时可能会遇到以下错误:

C语言编译器没装:

nginx四层负载均衡原理 nginx七层负载均衡配置_网络_03

解决:yum install -y gcc 

nginx四层负载均衡原理 nginx七层负载均衡配置_网络_04

 

 再编译问题2:PCRE库没找到:

nginx四层负载均衡原理 nginx七层负载均衡配置_nginx四层负载均衡原理_05

解决:  yum install -y pcre-devel (注:在centos和redhat中一般缺少什么包就在后面加上 -devel)

再编译openssl库未找到:

nginx四层负载均衡原理 nginx七层负载均衡配置_nginx_06

 

解决:yum install -y openssl-devel

再编译发现编译成功:

nginx四层负载均衡原理 nginx七层负载均衡配置_服务器_07

 此时生成了文件Makefile,此文件会指导我们进行make(将源码编译成本系统可以用的可执行程序):

nginx四层负载均衡原理 nginx七层负载均衡配置_网络_08

make完成后,会在该目录下的objs/nginx下生成nginx执行程序,再进行make install :

nginx四层负载均衡原理 nginx七层负载均衡配置_网络_09

 完成后所有编译好的nginx程序都在指定的路径:/usr/local/nginx下,由于此目录下的程序不在环境变量里,所以我们做一个软连接链接到/usr/local/bin下,以便以后不用必须在此目录下才能使用nginx程序:

nginx四层负载均衡原理 nginx七层负载均衡配置_网络_10

此时就可以正常启动nginx:

nginx四层负载均衡原理 nginx七层负载均衡配置_运维_11

注意:不能多次启动nginx,每次启动完成后要用nginx -s stop 关闭nginx,因为80端口不能被多次占用

此时nginx环境已经配置好!

 二、nginx配置文件设置

/usr/local/bin/nginx/nginx.conf 为nginx的主配置文件,修改此文件即可:

nginx四层负载均衡原理 nginx七层负载均衡配置_nginx_12

 修改配置文件:

 

nginx四层负载均衡原理 nginx七层负载均衡配置_运维_13

 在最后自己写一个模块:

nginx四层负载均衡原理 nginx七层负载均衡配置_服务器_14

 此时就可以保存退出,开启nginx服务,同时要在客户端的解析中把www.westos.org 加到nginx服务器的IP上:

nginx四层负载均衡原理 nginx七层负载均衡配置_服务器_15

此时外部访问nginx服务器发现负载均衡已经实现:

 

nginx四层负载均衡原理 nginx七层负载均衡配置_nginx四层负载均衡原理_16

在server2上关闭httpd服务,再进行访问:

nginx四层负载均衡原理 nginx七层负载均衡配置_运维_17

 

发现nginx不再对server2进行调度,说明nginx对后端自带健康检测。若此时再把server3挂掉:

nginx四层负载均衡原理 nginx七层负载均衡配置_nginx_18

 

系统报错,没有可用后端 ,此时我们可以这样设置:

nginx四层负载均衡原理 nginx七层负载均衡配置_nginx四层负载均衡原理_19

也可以加权重:

nginx四层负载均衡原理 nginx七层负载均衡配置_nginx_20

 

 注:每次修改完配置文件必须重新加载  nginx -s reload

我们也可以更换负载均衡算法:

nginx四层负载均衡原理 nginx七层负载均衡配置_运维_21

nginx四层负载均衡原理 nginx七层负载均衡配置_服务器_22

 

 此算法是一个客户端IP对应一个服务器IP,为了保证连接稳定

nginx四层负载均衡原理 nginx七层负载均衡配置_nginx四层负载均衡原理_23

Sticky cookie

此ip_hash算法是客户端发送请求到nginx服务器,再由nginx服务器到后端RS,后端RS再返回到nginx服务器再返回客户端,所以后端RS不知道是谁访问了自己。此时我们就要用Sticky cookie来实现,类似于浏览器的cookie。我们客户端发送请求时,后端RS返回信息时会将session信息传回客户端,客户端存到浏览器中,这是RS分配给每一个客户端的,以后每次请求RS就通过这个cookie来判断是哪个客户端。

nginx四层负载均衡原理 nginx七层负载均衡配置_nginx四层负载均衡原理_24

 开源文档中显示此功能只有Nginx Plus才有,此时我们就要先扩充一下我们的调度算法:加上sticky模块重新编译。

首先我们需要一个nginx-sticky的包

nginx四层负载均衡原理 nginx七层负载均衡配置_nginx_25

  此时我们可以优化一下:

编辑 auto/cc/gcc 关掉debug模式,使得编译出来的二进制程序更小

nginx四层负载均衡原理 nginx七层负载均衡配置_网络_26

编辑 src/core/nginx.h ,使得别人在访问时不能看见应用的版本,使系统更加安全

nginx四层负载均衡原理 nginx七层负载均衡配置_网络_27

 nginx是静态编译,所以在每次需要添加新功能时都要重新编译,并且之前的参数都要加上:

./configure --with-http_ssl_module --with-http_stub_status_module --prefix=/usr/local/nginx --add-module=/root/nginx-goodies-nginx-sticky-module-ng-08a395c66e42
make

nginx四层负载均衡原理 nginx七层负载均衡配置_服务器_28

 注:在编译之前一定要关闭nginx。且更新参数时./configure和make后一定不能做make install,因为他会直接覆盖掉之前的配置

 将最新生成的nginx二进制可执行文件覆盖之前的可执行文件。

nginx四层负载均衡原理 nginx七层负载均衡配置_nginx_29

此时nginx就有了sticky的cookie功能: 

nginx四层负载均衡原理 nginx七层负载均衡配置_网络_30

 检测语法没问题后启动nginx:

nginx四层负载均衡原理 nginx七层负载均衡配置_网络_31

 此时必须用浏览器访问才能看见效果,因为cookie只能存在于浏览器:

nginx四层负载均衡原理 nginx七层负载均衡配置_网络_32

nginx四层负载均衡原理 nginx七层负载均衡配置_nginx_33

  

此时我们发现用浏览器访问只能访问到server2,而用curl压测是负载均衡的。因为浏览器缓存了cookie值,cookie值不变,后端响应的RS也不会变。