安装环境:Centos6.5 x86_64系统最小化安装
实验环境:
           Nginx1:172.16.35.206
           Nginx2:172.16.35.81
           http1:172.16.35.249
           http2:172.16.35.75
           VIP:172.16.35.211

拓扑图:

       keepalived+Nginx负载均衡高可用_第1张图片

背景:

   既然有了Lvs+keepalived这样高性能的组合,那为何还要有Nginx+keepalived呢,keepalived的初衷就是为了Lvs而设计的,我们都知道Lvs是一个四层的负载均衡设备,虽然有着高性能的优势,但同时它却没有后端服务器的健康检查机制,keepalived为lvs设计了一系列的健康检查机制TCP_CHECK,UDP_CHECK,HTTP_GET等。同时lvs也可以自己写健康检查脚步。或者结合ldirectory来实现后端检测。但是固LVS始终无法摆脱它是一个四层设备,无法对上层协议进行解析。Nginx不一样,Nginx是一个七层的设备可以对七层协议进行解析,可以对一些请求进行过滤,还可以对请求结果进行缓存。这些都是Nginx独有的优势。但是keepalived并没有为Nginx提供健康检测。需要自己去写一些脚步来进行健康检测。关于Lvs+keepalived的构建可参考我的另一篇博文:

http://forlinux.blog.51cto.com/8001278/1404278


一:安装配置Nginx(结合gperftool来优化内存使用tcmalloc替代glibc来管理内存)

给Nginx1和Nginx2分别安装nginx服务,并配置upstream

#!/bin/bash
groupadd -r nginx
useradd -r -g nginx nginx
yum install gcc gcc-c++ openssl-devel pcre-devel wget vim automake autoconf -y
wget http://nginx.org/download/nginx-1.4.7.tar.gz
#这个地址可能有的时候无法解析到域名下载不到这个包,需要自己去下载包然后安装安装步骤一步一步安装
#wget http://mirror.yongbok.net/nongnu/libunwind/libunwind-1.1.tar.gz
wget http://gperftools.googlecode.com/files/gperftools-2.1.tar.gz
#                       libunwind install              
tar -xvf libunwind-1.1.tar.gz
cd libunwind-1.1
CFLAGS=-fPIC ./configure
make CFLAGS=-fPIC
make CFLAGS=-fPIC install
cd ..
#                       gperftools install
tar -xvf gperftools-2.1.tar.gz
cd gperftools-2.1
./configure
make && make install
echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
ldconfig
cd ..
#                       nginx install
tar zxvf nginx-1.4.7.tar.gz
cd nginx-1.4.7
./configure --prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-google_perftools_module \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-pcre
make && make install
#                       Setup
mkdir /tmp/tcmalloc
chmod 0777 /tmp/tcmalloc
#简单的一个nginx优化
cat >> /etc/sysctl.conf < 
  


Nginx配置:

upstream backserver {
        server 172.16.35.249:80 max_fails=3 fail_timeout=3s;
        server 172.16.35.75:80  max_fails=3 fail_timeout=3s;
}
   server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://backserver;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }


二:安装配置keepalived

#!/bin/bash
yum install kernel-devel gcc gcc-c++ openssl-devel -y
wget http://www.keepalived.org/software/keepalived-1.2.12.tar.gz
tar zxvf keepalived-1.2.12.tar.gz
cd keepalived-1.2.12
./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/*/
make && make install
mkdir /etc/keepalived
\cp  -f keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
\cp -f keepalived/etc/init.d/keepalived.init /etc/init.d/keepalived
\cp -f keepalived/etc/init.d/keepalived.sysconfig /etc/sysconfig/keepalived
\cp -f /usr/local/keepalived/sbin/keepalived /sbin/


配置keepalived

! Configuration File for keepalived
global_defs {
   notification_email {   
        [email protected]    #定义邮箱报警的邮箱地址
   }
   notification_email_from root@localhost #定义发送报警信息的地址
   smtp_server 127.0.0.1 #定义发送邮件的邮件服务器地址
   smtp_connect_timeout 30 #定义发送邮件的超时时间
   router_id LVS_DEVEL #全局标识
}
vrrp_script check_run {    #定义检查nginx服务的脚本
        script "killall -0 nginx" #killall -0 nginx会模拟杀死nginx进程,实际上并没有。如果可以模拟杀死则nginx服务正常。
        interval 2 #检查的间隔时间
        weight -2 #检查失败的话权重减2
        fall 2 #检查失败2次才认为是真正的检查失败
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100  #备用机器的keepalived的权重要小于这个权重,并且当nginx服务挂掉后100-2要小于备用机器的权重。
    advert_int 1
    smtp_alert #比较重要 定义使用邮件发送,不然上面的邮件定义都是没有用的,使用了这个当状态发生改变就会发送邮件报警
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {    #定义使用哪个脚本来检查。
        check_run
   }
    virtual_ipaddress {
        172.16.35.211
    }
}

备用keepalived上的配置文件和主keepaived一样,但是priority是99.这样的话当nginx挂掉了,主的keepalived就变成了98,那么备机就可以抢占VIP了


三:安装配置两台测试的机器

给两台测试机器安装Nginx提供web服务。并提供测试页面

echo "172.16.35.249" > /usr/local/nginx/html/index.html

echo "172.16.35.75" > /usr/local/nginx/html/index.html


四:测试最终的结果。

基本功能测试:

keepalived+Nginx负载均衡高可用_第2张图片


关闭了nginx后开vip是否漂移。

vip没有漂移之前:

keepalived+Nginx负载均衡高可用_第3张图片


关闭了Nginx后VIP进行了漂移

keepalived+Nginx负载均衡高可用_第4张图片

备用机器抢占VIP的过程

keepalived+Nginx负载均衡高可用_第5张图片



关闭Keepalived,看VIP偏移。

keepalived+Nginx负载均衡高可用_第6张图片


注意事项:

  1.keeaplived的配置文件要注意书写格式

   keepalived,默认不检查配置文件的语法问题。这是个很头疼的问题,我就遇见过好几次因为配置文件格式的问题搞了几个小时才解决。要避免从word中粘贴配置文件内容。一下总结下配置文件格式的一些问题:

1.VI_1 { 类似于这样的形式,关键字和{之间需要留空格

2.检测脚本要有权限。


  2.检测脚本也可以使用如下脚本:更具有健壮性。

#!/bin/bash
N=`ps -C nginx --no-header|wc -l`
if [ $N -eq 0 ];then
        /usr/local/nginx/sbin/nginx
        sleep 1
        if [ `ps -C nginx --no-header|wc -l` -eq 0 ];then
                service keepalived stop
        fi
fi