Linux系统运维

【实战演练】Linux操作系统15-LVS实现Nginx服务器负

2020-05-24  本文已影响0人  工程师Waiting

#本文欢迎转载,转载请注明出处和作者。

理论部分,在之前的文章已经说明过了,详见《【理论研究】业务系统高可用及负载均衡》。

上一篇已经讲述通过对2台Nginx服务器安装Keepalived软件+Nginx服务检测脚本,做高可用HA的配置。

本篇介绍通过增加LVS服务器,对2台Nginx服务器做负载均衡。

一般的系统,如果在私有云,企业会购买硬件负载均衡器(如F5、Radware、Array等),或者用服务器+LVS,再最外面弄一层网络负载均衡,这个通常是所有业务系统/服务共用的,属于IT基础实施。而每个业务系统/服务,会自己用服务器+Nginx,做自己的应用负载均衡/反向代理,这个通常是业务系统/服务自己使用的,不同业务系统自行搭建不同的Nginx服务器。

1、LVS

LVS的控制端,叫director,负责VIP以及分发流量。

后端被分发的服务器,叫做RealServer。有时候为了节省,机器可以既做Director也做Realserver。

实验中,我们增加1台LVS服务器(10.1.30.40)1做director,原来的2台Nginx服务器30.26、30.27做Realserver。

1.1检查LVS模块

用lvs分发到2台nginx服务器(此处nginx仅当作web服务器使用)

Centos6.5自带lvs模块,用如下命令可以检查

modprobe -l | grep ipvs

1.2安装依赖

yum install -y gcc gcc-c++ makepcre pcre-devel kernel-devel openssl-devel libnl-devel popt*

1.3安装lvs管理工具

管理工具叫ipvsadm,ipvsadm-1.26.tar.gz拷贝至/usr/local/下

cd /usr/local
tar -zxvf ipvsadm-1.26.tar.gz
cd ipvsadm-1.26
make & make install 

2、Nginx服务测试预设置

由于实现负载均衡后,直接访问VIP,发现业务能够正常访问,并且能够负载均衡到apache01、02,但是由于Nginx01、02设置了负载均衡到Apache,所以访问VIP屏蔽了Nginx01、02,无法看出到底VIP有没有负载到Nginx01、02,因此需要提前做些修改,方便测试。

2.1 临时取消Nginx负载均衡Apahce设置

cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak
vi  /usr/local/nginx/conf/nginx.conf

删除

upstream site{
        server 10.1.30.24;
        server 10.1.30.25;
    }

proxy_pass http://site;
#在location / {}里面

修改会话保持时间

keepalive_timeout  0;
#原有#去掉,否则连续访问VIP,会65秒内连续分发到同一台Nginx服务器
#keepalive_timeout  65;
#加上#注释掉

详见之前《【实战演练】Linux操作系统13-Nginx实现WEB服务器负载均衡》的4.1-5)

重启nginx服务

service nginx restart

此时单独访问Nginx01、02会显示Nginx的默认页面。

2.2 修改Nginx默认页面

修改Nginx01、02的默认欢迎页面,默认主页是/usr/local/nginx/html/index.html

mv /usr/local/nginx/html/index.html /usr/local/nginx/html/index.html.bak
vi /usr/local/nginx/html/index.html
#Nginx01设置为
This is Nginx01 10.1.30.26
#Nginx02设置为
This is Nginx02 10.1.30.27

单独访问Nginx01、02的IP进行测试

2.3 关闭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 
#使用修改生效

3、LVS Director配置

3.1 脚本自动配置

vi /etc/init.d/lvsdr

内容如下

#!/bin/sh
# 定义虚拟ip
VIP=10.1.30.31 #虚拟 ip根据需求修改
# 定义realserver,并已空格分开,根据需求修改
RIPS="10.1.30.26 10.1.30.27"
# 定义提供服务的端口
SERVICE=80
# 调用init.d脚本的标准库
. /etc/rc.d/init.d/functions
case $1 in
        start)
        echo "Start LVS of DR Mode"
        # 开启ip转发
        echo "1" > /proc/sys/net/ipv4/ip_forward
        # 绑定虚拟ip
        ifconfig eth1:0 $VIP broadcast $VIP netmask 255.255.255.255 up
        route add -host $VIP dev eth1:0
        # 清除lvs规则
        ipvsadm -C
        # 添加一条虚拟服务器记录
    # -p指定一定的时间内将相同的客户端分配到同一台后端服务器
    # 用于解决session的问题,测试时或有别的解决方案时建议去掉
        ipvsadm -A -t $VIP:$SERVICE -s rr
        # 添加真实服务器记录
        for RIP in $RIPS
    do
        echo $RIP:$SERVICE;
                ipvsadm -a -t $VIP:$SERVICE -r $RIP:$SERVICE -g
        done
        # 设置tcp tcpfin  udp的超时连接值
        ipvsadm --set 30 120 300
        ipvsadm
        ;;

        stop)
        echo "Stop LVS DR"
        ifconfig eth1:0 down
        ipvsadm -C
        ;;
        *)
        echo "Usage:$0 {start ¦ stop}"
        exit 1
esac

保存后增加执行权限

chmod 777 /etc/init.d/lvsdr

启动LVS服务

service lvsdr start

3.2 手工配置(如果已经做了脚本自动配置,就不需要再做手工配置了)

3.2.1 绑定VIP

绑定虚拟IP(注意网卡按照机器实际网卡更改,如eth0,则改eth1为eth0)

ifconfig eth1:0 10.1.30.31 broadcast 10.1.30.31 netmask 255.255.255.255 up

3.2.2添加路由规则

route add -host 10.1.30.31 dev eth1:0

3.2.3启动包转发功能

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

3.2.4清除原有转发规则

ipvsadm --clear

3.2.5添加虚拟IP规则

ipvsadm -A -t 10.1.30.31:80 -s rr

-s rr表示采用轮询策略。

:80表示负载转发的端口是80

3.2.6在虚拟IP中添加服务规则

ipvsadm -a -t 10.1.30.31:80 -r 10.1.30.26:80 -g
ipvsadm -a -t 10.1.30.31:80 -r 10.1.30.27:80 -g 

在新加虚拟IP记录中添加两条新的Real Server记录,-g表示指定LVS 的工作模式为直接路由模式。

lvs进行负载转发需要保证lvs负载的端口要和nginx服务的端口的一致,这里都为80。

3.2.7重启LVS

Ipvsadm

4、Realserver配置(2台Nginx服务器)

4.1 脚本自动配置

vi /etc/init.d/lvsdr

内容如下:

#!/bin/sh
VIP=10.1.30.31 #虚拟ip,根据需求修改
. /etc/rc.d/init.d/functions
case $1 in
        start)
        echo "lo:0 port starting"
        # 为了相应lvs调度器转发过来的包,需在本地lo接口上绑定vip
        ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
        # 限制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
        ;;
        stop)
        echo "lo:0 port closing"
        ifconfig lo:0 down
        echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
    echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
        ;;
        *)
        echo "Usage: $0 {start ¦ stop}"
        exit 1
esac

增加执行权限

chmod 777 /etc/init.d/lvsdr

然后可以直接使用service lvsdr start/stop进行启停。

service lvsdr start

4.2 手工配置(如果已经做了脚本自动配置,就不需要再做手工配置了)

4.2.1环回接口绑定VIP

ifconfig lo:0 10.1.30.31 broadcast 10.1.30.31 netmask 255.255.255.255 up
/sbin/route add -host 10.1.30.31 dev lo:0

4.2.2关闭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 

使用修改生效

5、测试

通过VIP(10.1.30.31)访问业务,并且不断刷新,发现能够早Ngix01与02之间负载均衡。

上一篇 下一篇

猜你喜欢

热点阅读