一、工作原理复习
1、客户端发送请求到 Director Server (负载均衡器 DS),请求的数据报文(源IP是CIP,目标IP是VIP)到达内核空间,Director Server 和 Real Server 在同一个网络中,数据通过二层数据链路层来传输
2、内核空间判断数据包的目标IP是本机IP,此时LVS比对数据包请求的服务是否是集群服务,是集群服务就重新封装数据包。修改源 MAC 地址为 Director Server 的 MAC 地址,修改目标 MAC 地址为 Real Server 的 MAC 地址,源IP地址与目标IP地址没有改变,然后将数据包发送给 Real Server 1
3、到达 Real Server 的请求报文的 MAC 地址是自身的 MAC 地址,就接收此报文。数据包重新封装报文(源IP地址为VIP,目标IP 为CIP),将响应报文通过IO接口传送给物理网卡然后向外发出,Real server 1 直接将响应报文传送到客户端

二、lvs四层直接代理应用
lvs四层–代理应用:real server是应用服务器
1、环境准备(所有机器)
setenforce 0 systemctl stop firewalld 配置静态ip 配置时间同步
2、主机规划
VIP:192.168.71.200 DIP:192.168.71.115 web01(nginx+静态页面): 192.168.71.112:8080 web02(nginx+静态页面): 192.168.71.113:8080 web03(nginx+静态页面): 192.168.71.114:8080
3、lvs四层负载均衡部署(在192.168.71.115这台机器上部署)
3.1 安装ipvs
# 1、安装ipvsadm等相关工具
yum -y install ipvsadm ipset sysstat conntrack libseccomp
# 2、配置加载
cat > /etc/sysconfig/modules/ipvs.modules <<"EOF"
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
for kernel_module in ${ipvs_modules};
do
/sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1
if [ $? -eq 0 ]; then
/sbin/modprobe ${kernel_module}
fi
done
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs
3.2 为四层负载均衡机器添加一个vip
#1、需要特别注意的是,虚拟ip地址的广播地址是它本身,子网掩码是255.255.255.255。 ifconfig ens36:0 192.168.71.200 broadcast 192.168.71.200 netmask 255.255.255.255 up #2、添加路由规则 route add -host 192.168.71.200 dev ens36:0 #3、启用系统的包转发功能 echo "1" >/proc/sys/net/ipv4/ip_forward
# 强调强调强调:LVS本身不支持将请求的目标端口从一个端口转换到另一个端口,所以 # ipvsadm -a -t 192.168.71.200:6666 -r 192.168.71.112:8080 -g # 这种添加方法是错误的,必须端口一致 ipvsadm -C #清除内核虚拟服务器表中的所有记录 ipvsadm -A -t 192.168.71.200:8080 -s rr # -s rr表示采用轮询策略。 ipvsadm -a -t 192.168.71.200:8080 -r 192.168.71.112:8080 -g #添加服务器节点,-g表示指定LVS 的工作模式为直接路由模式 ipvsadm -a -t 192.168.71.200:8080 -r 192.168.71.113:8080 -g #添加服务器节点 ipvsadm -a -t 192.168.71.200:8080 -r 192.168.71.114:8080 -g #添加服务器节点 ipvsadm -Ln #查看节点状态,加个“-n”将以数字形式显示地址、端口信息
4、RS配置(三台web服务器上)
ifconfig lo:0 192.168.71.200 broadcast 192.168.71.200 netmask 255.255.255.255 up route add -host 192.168.71.200 dev lo:0
4.2 关闭arp解析
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce cat >> /etc/sysctl.conf << EOF net.ipv4.ip_forward=1 net.ipv4.conf.lo.arp_ignore=1 net.ipv4.conf.all.arp_ignore=1 net.ipv4.conf.lo.arp_announce=2 net.ipv4.conf.all.arp_announce=2 EOF sysctl -p #使用修改生效
配置注解:
arp_announce :定义不同级别:当ARP请求通过某个端口进来是否利用这个接口来回应。
0 -利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;
1 – 避免使用另外一个接口上的mac地址去响应ARP请求;
2 – 尽可能使用能够匹配到ARP请求的最佳地址。
arp_ignore:当ARP请求发过来后发现自己正是请求的地址是否响应;
0 – 利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;
1 – 哪个接口上接受ARP请求,就从哪个端口上回应。
4.3 三个web上部署
部署nginx 然后放置文件:/usr/share/nginx/html/1.txt # 分别写入web01、web02、web03
5、测试访问
方式一:浏览器访问测试
先把所有web上的nginx配置里的keepalive_timeout都设置为0,否则会因为长连接而经常访问到一个
http {
keepalive_timeout 0;
。。。。。。
}

方式二:在四层负载均衡以外的任一台机器上
[root@db ~]# curl http://192.168.71.200:8080/1.txt ---------------------web033333333333333333333333333333333333 [root@db ~]# curl http://192.168.71.200:8080/1.txt -------------web02222222222222222222 [root@db ~]# curl http://192.168.71.200:8080/1.txt --------------------web01111111111111111
三、lvs四层+nginx七层+应用
lvs四层–代理七层负载均衡nginx—代理web服务器:real server是七层负载均衡nginx,需要在它的lo上配置vip
1、环境准备(所有机器)
同上
2、主机规划
# 1、四层 VIP:192.168.71.200 DIP:192.168.71.115 # 2、两台七层 七层01(用nginx做七层负载):192.168.71.116:8081 七层02(用nginx做七层负载):192.168.71.111:8081 # 3、三台web web01(nginx+静态页面): 192.168.71.112:8080 web02(nginx+静态页面): 192.168.71.113:8080 web03(nginx+静态页面): 192.168.71.114:8080
两台七层一样的配置,代理三台web
[root@lb01 ~]# cat /etc/nginx/nginx.conf
events {
worker_connections 1024;
}
http {
upstream web_app_servers {
server 192.168.71.112:8080 weight=1;
server 192.168.71.113:8080 weight=1;
server 192.168.71.114:8080 weight=1;
}
server {
listen 8081; # 强调:这里个的配置直接就监听端口,我们之前的课程中在其末尾加的proxy_protocol一定要去掉
location / {
proxy_pass http://web_app_servers;
}
}
}
3、lvs四层负载均衡部署(在192.168.71.115这台机器上部署)
3.1 安装ipvs(与第二章节的配置一模一样)
# 1、安装ipvsadm等相关工具
yum -y install ipvsadm ipset sysstat conntrack libseccomp
# 2、配置加载
cat > /etc/sysconfig/modules/ipvs.modules <<"EOF"
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
for kernel_module in ${ipvs_modules};
do
/sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1
if [ $? -eq 0 ]; then
/sbin/modprobe ${kernel_module}
fi
done
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs
3.2 为四层负载均衡机器添加一个vip(与第二章节的配置一模一样)
#1、需要特别注意的是,虚拟ip地址的广播地址是它本身,子网掩码是255.255.255.255。 ifconfig ens36:0 192.168.71.200 broadcast 192.168.71.200 netmask 255.255.255.255 up #2、添加路由规则 route add -host 192.168.71.200 dev ens36:0 #3、启用系统的包转发功能 echo "1" >/proc/sys/net/ipv4/ip_forward
ipvsadm -C #清除内核虚拟服务器表中的所有记录 ipvsadm -A -t 192.168.71.200:8081 -s rr # -s rr表示采用轮询策略。 ipvsadm -a -t 192.168.71.200:8081 -r 192.168.71.116:8081 -g #添加服务器节点,-g表示指定LVS 的工作模式为直接路由模式 ipvsadm -a -t 192.168.71.200:8081 -r 192.168.71.111:8081 -g #添加服务器节点 ipvsadm -Ln #查看节点状态,加个“-n”将以数字形式显示地址、端口信息
4、RS配置(两台负载均衡是我们的RS,而不是web应用)
ifconfig lo:0 192.168.71.200 broadcast 192.168.71.200 netmask 255.255.255.255 up route add -host 192.168.71.200 dev lo:0
4.2 关闭arp解析
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce cat >> /etc/sysctl.conf << EOF net.ipv4.ip_forward=1 net.ipv4.conf.lo.arp_ignore=1 net.ipv4.conf.all.arp_ignore=1 net.ipv4.conf.lo.arp_announce=2 net.ipv4.conf.all.arp_announce=2 EOF sysctl -p #使用修改生效
配置注解:
arp_announce :定义不同级别:当ARP请求通过某个端口进来是否利用这个接口来回应。
0 -利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;
1 – 避免使用另外一个接口上的mac地址去响应ARP请求;
2 – 尽可能使用能够匹配到ARP请求的最佳地址。
arp_ignore:当ARP请求发过来后发现自己正是请求的地址是否响应;
0 – 利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;
1 – 哪个接口上接受ARP请求,就从哪个端口上回应。
4.3 三个web上部署
部署nginx 然后放置文件:/usr/share/nginx/html/1.txt # 分别写入web01、web02、web03
5、测试访问
方式一:浏览器访问测试
先把所有web上的nginx配置里的keepalive_timeout都设置为0,否则会因为长连接而经常访问到一个
http {
keepalive_timeout 0;
。。。。。。
}
方式二:
[root@web01 ~]# curl http://192.168.71.200:8081/1.txt --------------------web01111111111111111 [root@web01 ~]# curl http://192.168.71.200:8081/1.txt --------------------web01111111111111111 [root@web01 ~]# curl http://192.168.71.200:8081/1.txt -------------web02222222222222222222 [root@web01 ~]# curl http://192.168.71.200:8081/1.txt -------------web02222222222222222222 [root@web01 ~]# curl http://192.168.71.200:8081/1.txt ---------------------web033333333333333333333333333333333333 [root@web01 ~]# curl http://192.168.71.200:8081/1.txt ---------------------web03333333333333333333333333333333333
四、lvs四层代理nginx七层实现透传真实客户端ip
1、LVS-DR模式改变的是底层的mac地址,客户端ip地址本身就是透传的
2、所以我们只需要在七层负载均衡里用proxy_set_header指令来转发客户端真实ip即可
[root@db ~]# cat /etc/nginx/nginx.conf
events {
worker_connections 1024;
}
http {
#keepalive_timeout 0;
upstream web_app_servers {
server 192.168.71.112:8080 weight=1;
server 192.168.71.113:8080 weight=1;
server 192.168.71.114:8080 weight=1;
}
server {
listen 8081;
location / {
proxy_pass http://web_app_servers;
# -------------------》只加上下面这一段即可
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
3、后端的web里只需要从配置日志即可,其他地方都不需要配置
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; # 末尾加个$http_x_forwarded_for
测试:客户端(192.168.71.7 windows打开浏览器)访问
