这个帖子讲得很细致,基本依照这个方案实践。
只是IP是按我自己虚拟机的IP来测试的。
======================================
搭建环境:
vip:192.168.1.100
lvs-director:192.168.1.111
nginx1:192.168.1.112
nginx2:192.168.1.113
-------------------------------------------------------------------
已下操作,在LVS服务器上操作
-------------------------------------------------------------------
一,先在LVS服务器上确认也安装好LVS。
这里要注意的是modbprobe -l这个命令已不灵了。
使用如下替代 。
find /lib/modules/$(uname -r)/ -iname "**.ko*" | cut -d/ -f5-|grep ip_vs
有输出Ip_vs说明内核已加载模块。如果没有加载,按其它教程加载哈。
二,安装ipvsadm工具,很简单
yum install ipvs
三,在网卡上绑定VIP(虚拟IP, 注意在centos 7上,我这里的网卡不是eth0,而是enp0s3)
ifconfig enp0s3:0 192.168.1.100 broadcast 192.168.1.100 netmask 255.255.255.255 up
四,增加一条路由规则。
route add -host 192.168.1.100 dev enp0s3:0
五,启用系统的包转发功能。
echo "1" >/proc/sys/net/ipv4/ip_forward
六,先清空系统之前的所有ipvsadm规则
ipvsadm -C ipvsadm --clear
七,增加虚拟IP规则(-s rr表示轮询规则)
ipvsadm -A -t 192.168.1.100:80 -s rr
八,在虚拟IP中增加服务规则(-g表示工作模式为直接路由)
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.112:80 -g ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.113:80 -g
lvs进行负载转发需要保证lvs负载的端口要和nginx服务的端口的一致,这里都为80。
九,使用ifconfig, ipvsadm -ln,route命令,查看的输出如下,表示设置完成。
enp0s3:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.100 netmask 255.255.255.255 broadcast 192.168.1.100
ether 08:00:27:47:b2:29 txqueuelen 1000 (Ethernet)
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.100:80 rr
-> 192.168.1.112:80 Route 1 0 0
-> 192.168.1.113:80 Route 1 0 0
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 enp0s3
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s3
192.168.1.100 0.0.0.0 255.255.255.255 UH 0 0 0 enp0s3
-------------------------------------------------------------------
已下操作,在各个NGINX服务器上操作
-------------------------------------------------------------------
在lvs的DR和TUn模式下,用户的访问请求到达真实服务器后,是直接返回给用户的,而不再经过前端的Director Server,因此,就需要在每个Real server节点上增加虚拟的VIP地址,这样数据才能直接返回给用户。
一,安装nginx。
二,设置nginx.conf的keepalive_timeout 0。
三,在lo端口绑定VIP。
ifconfig lo:0 192.168.1.100 broadcast 192.168.1.100 netmask 255.255.255.255 up
四,增加一条路由。
route add -host 192.168.1.100 dev lo:0
五,关闭ARP。
arp_announce :定义不同级别:当ARP请求通过某个端口进来是否利用这个接口来回应。
0 -利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;
1 - 避免使用另外一个接口上的mac地址去响应ARP请求;
2 - 尽可能使用能够匹配到ARP请求的最佳地址。
arp_ignore:当ARP请求发过来后发现自己正是请求的地址是否响应;
0 - 利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;
1 - 哪个接口上接受ARP请求,就从哪个端口上回应。
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p
六,使用ifconfig, route -n命令,查看的输出如下,表示设置完成。
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.1.100 netmask 255.255.255.255
loop txqueuelen 1 (Local Loopback)
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 enp0s3
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s3
192.168.1.100 0.0.0.0 255.255.255.255 UH 0 0 0 lo
=======================================
以下为访问Http://192.168.1.100的输出
=======================================