Stay Hungry.Stay Foolish.
nginx+keepalived实现代理高可用

环境

两台linux虚机,分别安装keepalived和nginx。

配置

master机器keepalived配置

global_defs {  
    router_id NodeA  
}  

vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh" 
    interval 2 
    weight -5 
    fall 3  
    rise 2 
}

vrrp_instance VI_1 {  
    state MASTER    #设置为主服务器  
    interface enp0s8  #监测网络接口  
    virtual_router_id 51  #主、备必须一样  
    priority 100   #(主、备机取不同的优先级,主机值较大,备份机值较小,值越大优先级越高)  
    advert_int 1   #VRRP Multicast广播周期秒数  
    authentication {  
        auth_type PASS  #VRRP认证方式,主备必须一致  
        auth_pass 1111   #(密码)  
    }
    virtual_ipaddress {  
        192.168.33.100/24  #VRRP HA虚拟地址  
    }  
    track_script {
        chk_nginx 
    }
    notify_master "/home/vagrant/nofity.py master "
    notify_backup "/home/vagrant/notify.py backup"
}

slaver机器keepalived配置

global_defs {  
    router_id NodeB
}  

vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh" 
    interval 2 
    weight -5 
    fall 3  
    rise 2 
}

vrrp_instance VI_1 {  
    state MASTER    #设置为主服务器  
    interface enp0s8  #监测网络接口  
    virtual_router_id 51  #主、备必须一样  
    priority 50  #(主、备机取不同的优先级,主机值较大,备份机值较小,值越大优先级越高)  
    advert_int 1   #VRRP Multicast广播周期秒数  
    authentication {  
        auth_type PASS  #VRRP认证方式,主备必须一致  
        auth_pass 1111   #(密码)  
    }
    virtual_ipaddress {  
        192.168.33.100/24  #VRRP HA虚拟地址  
    }  
    track_script {
        chk_nginx 
    }
    notify_master "/home/vagrant/notify.py master "
    notify_backup "/home/vagrant/notify.py backup"
}

notify.py是主备机切换时候的邮件告警, 代码中的4个xxx需要根据自己调整

#!/usr/bin/env python  
#-*- coding: UTF-8 -*-  
import sys
import socket
import fcntl
import struct
import smtplib  
from email.mime.text import MIMEText  

mail_host="xxx"
mail_user="xxx"
mail_pass="xxx"
def send_mail(to_list,sub,content):  
    msg = MIMEText(content,_subtype='plain')  
    msg['Subject'] = sub  
    msg['From'] = mail_user  
    msg['To'] = ";".join(to_list)
    try:  
        server = smtplib.SMTP()
        server.connect(mail_host)
        server.login(mail_user, mail_pass)
        server.sendmail(mail_user, to_list, msg.as_string())
        server.close()
    except Exception, e:  
        print e
        pass

def get_ip_address(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(
        s.fileno(),
        0x8915,  # SIOCGIFADDR
        struct.pack('256s', ifname[:15])
    )[20:24])

mailto_list = ['xxx'] 
send_mail(mailto_list, "nginx keepalived changed", "nginx server [%s] chang to %s service" % (get_ip_address("xxx"), sys.argv[1]))

chk_nginx是检测nginx是否alived的脚本,由此判断是否停止keepalived服务

#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
    /usr/sbin/nginx
    sleep 2
    counter=$(ps -C nginx --no-heading|wc -l)
    if [ "${counter}" = "0" ]; then
    service keepalived stop
    fi
fi

功能: 检测nginx进程是否alived,如果没有,尝试启动,如果失败,停止keepalived服务,然后vip就会漂移到备机。

自由转载-非商用-非衍生-保持署名(创意共享3.0许可证
评论

暂无评论~~