(1 )环境说明,只需要一个公网IP。

三台服务器一台作为 director, 两台作为 real server,Director 有一个外网 ip

(192.168.31.10) 和一个内网 ip(192.168.1.80), 两个 real server 上只有内网

ip(192.168.1.60)和(192.168.1.70) 并且需要把两个 real server 的内网网关设置为 director

的内网 ip(192.168.1.80)。

(2 )安装和配置

两个 real server 上都安装 nginx 服务

yum install -y nginx

Director 上安装 ipvsadm

yum install -y ipvsadm

Direcotr 上编辑 nat 实现脚本

vim /usr/local/sbin/lvs_nat.sh

写入如下内容:

#!/bin/bash

#director 服务器上开启路由转发功能:

echo 1 > /proc/sys/net/ipv4/ip_forward

#关闭 icmp 的重定向

echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects

echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects

echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects

echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects

#director 设置 nat 防火墙

iptables -t nat -F

iptables -t nat -X

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE

#director 设置 ipvsadm

IPVSADM='/sbin/ipvsadm'

$IPVSADM -C

$IPVSADM -A -t 192.168.31.10:80 -s wrr -p 300

$IPVSADM -a -t 192.168.31.10:80 -r 192.168.1.60:80 -m -w 1

$IPVSADM -a -t 192.168.31.10:80 -r 192.168.1.70:80 -m -w 1

保存后,在 Director 上直接运行这个脚本就可以完成 lvs/nat 的配置了。

#/bin/bash /usr/local/sbin/lvs_nat.sh

注:wrr 是权重轮询  -p 300为长连接,即一直发送请求到某一台机器,而不轮询。这里可以不要

    -m 是伪装转换 -w是权重

(3 )测试

通过浏览器测试两台机器上的 web 内容 http://192.168.31.10。为了区分开,我们可以

把 nginx 的默认页修改一下:

在 RS1 上执行

# echo "rs1rs1" >/usr/share/nginx/html/index.html

在 rs2 上执行

# echo "rs2rs2" >/usr/share/nginx/html/index.html

注意,切记一定要在两台 RS 上设置网关的 IP 为 director 的内网 IP。

如果是3台虚拟机,会出现网页打不开,curl可以测试成功的现象。crul 192.168.31.10,这是因为另一块网卡使用了host-only模式,改为NAT后正常。

课后答疑:

1.能说说在这里关闭icmp的重定向是什么意思吗?

答:http://blog.csdn.net/pi9nc/article/details/23380589 这里面有相关的解释:

LVS为什么会产生ICMP重定向问题: * 在LVS-NAT模式下,如果LVS的各个成员,client,LVS,Real-server在同一个网段(比如:192.168.1.*/24);

当Real-server将Reply发送回LVS时,Reply包是 RIP -> CIP的,LVS看到RIP-> CIP实际上根本没必要经过LVS,直接到网关就行了,因为大家在一个网段,所以产生ICMP重定向发送给Real-server;Real-server收到ICMP重定向包后,如果Real-server的ICMP重定向开启了,Real-server就会处理ICMP重定向包,直接将Reply包发给网关,这时Reply包头并没有被LVS重写,所以LVS负载出现了问题。

注意:这种情况只会出现在所有的LVS的成员都在一个网段的情况下。

2.# director 服务器上开启路由转发功能: 

echo 1 > /proc/sys/net/ipv4/ip_forward 

# 关闭icmp的重定向

echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects

echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects

echo 0和1 > 到一个进程,就是打开或关闭一个进程么?

答:跟进程没关系,这个是内核参数,也可以理解为功能开关。