当前位置: > Linux服务器 > nginx >

nginx+keepalive测试

时间:2014-05-15 01:59来源:linux.it.net.cn 作者:it
本测试是在两台OS环境为centos 5.5 64位系统上进行。
nginx版本:
/usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.0.12
keepalive版本:
/usr/local/keepalived/sbin/keepalived -v
Keepalived v1.1.17 (11/07,2012)
 
 
一、安装nginx和keepalive

1、nginx的安装网上太多,这里忽略。

2、安装keepalive,两台测试机都要安装。
wget http://www.keepalived.org/software/keepalived-1.1.17.tar.gz          ####下载包

tar zxvf keepalived-1.1.17.tar.gz                                         ####解压包
cd keepalived-1.1.17
./configure --prefix=/usr/local/keepalived                         ####编译安装并指定目录
make
make install
 
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
mkdir /etc/keepalived
cd /etc/keepalived
vim keepalived.conf                                    ####配置文件内容如下(主)
! Configuration File for keepalived
global_defs {
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER                                            ####主用MASTER,从用BACKUP
interface eth0                                          ####监测的网络接口
virtual_router_id 51                                    ####主从上要设置一样的值
#backup ipaddress
mcast_src_ip 10.1.1.191                                 ####主机的IP,备机更换备机用的IP
priority 100                                            ####权重,备机比主机稍微调小一点就行
advert_int 1                                            ####VRRP Multicast广播周期秒数
authentication {
auth_type PASS                                          ####VRRP认证方式
auth_pass qwerty                                        ####认证密码       
}
virtual_ipaddress {
10.1.1.190                                              ####VRRP
}
}

3、启动keepalive
/etc/init.d/keepalived start
启动后查看状态: ip addr | grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    inet 10.1.1.191/24 brd 10.1.1.255 scope global eth0
    inet 10.1.1.190/32 scope global eth0
 
###########################################################################
这里出现了个很2的问题,折腾了我很久,一直以为是配置有错误,后来发现是正常的。
从上面查询的主的状态看很正常,然后跑到从的上去查看状态:
ip a | grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    inet 10.1.1.192/24 brd 10.1.1.255 scope global eth0
奇怪了,和主的不一样,怎么修改配置文件,重启都没用。查看从的LOG
tail -f /var/log/message
Nov  7 15:34:08 nginx2 Keepalived: Starting Keepalived v1.1.17 (11/07,2012)
Nov  7 15:34:08 nginx2 Keepalived_vrrp: Using MII-BMSR NIC polling thread...
Nov  7 15:34:08 nginx2 Keepalived: Starting VRRP child process, pid=9834
Nov  7 15:34:08 nginx2 Keepalived_vrrp: Registering Kernel netlink reflector
Nov  7 15:34:08 nginx2 Keepalived_vrrp: Registering Kernel netlink command channel
Nov  7 15:34:08 nginx2 Keepalived_vrrp: Registering gratutious ARP shared channel
Nov  7 15:34:08 nginx2 Keepalived_vrrp: Opening file '/etc/keepalived/keepalived.conf'.
Nov  7 15:34:08 nginx2 Keepalived_vrrp: Configuration is using : 60997 Bytes
Nov  7 15:34:08 nginx2 Keepalived_vrrp: VRRP_Instance(VI_1) Entering BACKUP STATE
Nov  7 15:34:08 nginx2 Keepalived_vrrp: VRRP sockpool: [ifindex(2), proto(112), fd(9,10)]
再看下主的LOG
Nov  7 15:28:55 nginx1 Keepalived: Starting VRRP child process, pid=10139
Nov  7 15:28:55 nginx1 Keepalived_vrrp: Registering Kernel netlink reflector
Nov  7 15:28:55 nginx1 Keepalived_vrrp: Registering Kernel netlink command channel
Nov  7 15:28:55 nginx1 Keepalived_vrrp: Registering gratutious ARP shared channel
Nov  7 15:28:56 nginx1 Keepalived_vrrp: Opening file '/etc/keepalived/keepalived.conf'.
Nov  7 15:28:56 nginx1 Keepalived_vrrp: Configuration is using : 60999 Bytes
Nov  7 15:28:56 nginx1 Keepalived_vrrp: VRRP sockpool: [ifindex(2), proto(112), fd(9,10)]
Nov  7 15:28:57 nginx1 Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE
Nov  7 15:28:58 nginx1 Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE
Nov  7 15:28:58 nginx1 Keepalived_vrrp: VRRP_Instance(VI_1) setting protocol VIPs.
Nov  7 15:28:58 nginx1 Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 10.1.1.190
实在找不到原因了,就随便测试下,停了主的keepalive,额,再看下从的状态
ip a | grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    inet 10.1.1.192/24 brd 10.1.1.255 scope global eth0
    inet 10.1.1.190/32 scope global eth0
能看到设置的VRRP了。因为主的keepalive停了,程序检测到有异常,就让从接管了吧。
###############################################################################
 
二、测试情况
测试1,拿一台机器ping 10.1.1.190,然后停掉主(10.1.1.191)的keepalive,在丢失1-2个包的情况下,正常切换到了从(10.1.1.192)上。
通过停keepalive前后的ssh操作可以确定分别连接到两台机器。
 
测试2,拿一台机器ping 10.1.1.190,然后断开主(10.1.1.191)的网络(/etc/init.d/network stop),在丢失1-2个包的情况下,正常切换到了从(10.1.1.192)上。
通过断开网络前后的ssh操作可以确定分别连接到两台机器。
 
测试3,访问10.1.1.190的80服务(前提是10.1.1.191和10.1.1.192上的80服务开启),停掉10.1.1.191上的80服务(我这里是Killall nginx),再访问10.1.1.190的80服务,
无法正常访问。

网上流传着高人使用的脚本,大意就是每5秒判断一次nginx进程是否存在,如果存在就不做任何操作,如果不存在就重启nginx,重启后再判断一次nginx是否存在,如果存在
就不做操作,如果不存在kill掉keepalive,这样VRRP也会切换到从上。
vim /root/nginx_pid.sh  
#!/bin/bash 
while  : 
do
  nginxpid=`ps -C nginx --no-header | wc -l`  
  if [ $nginxpid -eq 0 ];then
    /usr/local/nginx/sbin/nginx   
    sleep 5   
    nginxpid=`ps -C nginx --no-header | wc -l`  
    if [ $nginxpid -eq 0 ];then    
    /etc/init.d/keepalived stop    
    fi
  fi
  sleep 5  
done
 
 
 
 
 
 
补充:
    重新找了下资料,nginx程序出现问题的时候对keepalive的切换可以这么做:
修改keepalive的配置文件,添加红字部分:
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script check_nginx {
     script "/etc/keepalived/check_nginx.sh"
     interval 2
     weight 2
     }

vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
#backup ipaddress
mcast_src_ip 10.1.1.191
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass ufsoft
}
track_script {
     check_nginx
     }

virtual_ipaddress {
10.1.1.190
}
}
在配置文件中增加的
/etc/keepalived/check_nginx.sh内容如下:
#!/bin/bash
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
 then
  killall -9  keepalived
fi

判断nginx进程是否存在,如果不存在则kill掉keepalived进程,这样实现了nginx程序出现异常时的keepalive切换,不用单独再跑一个脚本来做nginx验证操作了。
 
经过测试,killall掉nginx后,keepalive也会退出。另外验证80服务也能正常切换。
(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容