keepalived + nginx
-
实现思路是:master的优先级为100,backup的优先级为99;在master上面配置一个检测nginx监控状态的脚本(backup不用配置),当发现master的nginx故障后将master的优先级减2为98,使其backup优先级比master高,bakup获取到vip对外提供服务;当master服务器上面的nginx服务恢复正常后,master的优先级不减2恢复原来的100,master获取到vip对外提供服务
-
邮件报警实现思路:使用keepalived的状态转换执行脚本参数notify_master|notify_backup;当角色变为master或backup时去调用发送邮件的脚本给指定用户发送邮件通知
Keepalived_master配置文件:
global_defs {
router_id proxy-master ##定义设备的名称这里尽量使用主机名 在hosts文件中填在127.0.0.1 proxy-master
}
vrrp_script chknginx { ##定义nginx健康检查脚本
script "/etc/keepalived/scripts/chk_nginx.sh" ##健康检查脚本存放路径
interval 3 ##每多少秒进行一次健康检查
weight -2 ##检查失败优先级减2
}
vrrp_instance VI_1 { ##定义一个备份实例
state MASTER ##此服务器为master状态
interface ens33 ##vip绑定到哪块网卡
virtual_router_id 1 ##热备组id,同一个组id要一致
priority 100 ##当前设备的优先级
advert_int 3 ##备份组内多久进行一次健康检查
notify_master "/etc/keepalived/scripts/mail.sh Master" ##状态为master时发送邮件脚本
notify_backup "/etc/keepalived/scripts/mail.sh Backup" ##状态为backup时发送邮件脚本
authentication { ##实例间认证的信息
auth_type PASS ##认证的类型
auth_pass putianhui ##认证的密码
}
virtual_ipaddress { ##设置vip的地址
192.168.2.254 dev ens33 label ens33:1 ##设置vip并添加一个网卡别名
}
track_script {
chknginx ##调用nginx健康检查
}
Keepalived_backup配置文件:
global_defs {
router_id proxy-slave ##定义此设备的名称
}
vrrp_instance VI_1 { ##定义热备组实例
state BACKUP ##此服务器为备份状态
interface ens33 ##vip绑定到哪块网卡
virtual_router_id 1 ##热备组id,同一个组id要一致
priority 99 ##当前设备的优先级
advert_int 1
authentication {
auth_type PASS
auth_pass putianhui ##认证的密码,同一个组密码要一致
}
virtual_ipaddress {
192.168.2.254 dev ens33 label ens33:1
}
}
上面用到的脚本代码信息
chk_nginx.sh脚本信息
#!/bin/bash
#判断80端口是否存在,不存在就退出返回1
#返回1就是判定监控检查失败,0为正常
LISTEN_PORT=80
STATUS=`/usr/bin/netstat -anpt | grep "$LISTEN_PORT" | grep -v grep |wc -l`
if [ "$STATUS" -eq 0 ];then
# /usr/sbin/nginx
sleep 5
if [ "$STATUS" -eq 0 ];then
exit 1
else
exit 0
fi
else
exit 0
fi
######mail发送邮件报警脚本信息
#!/bin/bash
#使用mailx向指定用户发送邮件
#$1为keepalived状态发生变化执行脚本传进来的第一个参数
#XXXXXX@163.com为接收报警邮件的用户邮箱地址
NAME="Proxy_master Server"
TIME=$(date +%F_%H:%M)
echo "${TIME}--${NAME} status is $1" | mail -s "${NAME} status is $1" XXXXXX@163.com
配置发送报警邮件:
1、 安装sendmail或postfix (邮件传送代理MTA),本教程使用sendmail软件。
(标注:如果直接使用外部邮箱【qq企业邮和网易企业邮等】发送邮件可以不需要配置sendmail或postfix,直接把这两个软件关掉,直接跳到第3步:配置mail即可实现)
[root@ssticentos65 ~]# yum -y install sendmail #在线yum安装sendmail
[root@ssticentos65 ~]# /etc/init.d/sendmail start #启动sendmail服务
[root@ssticentos65 ~]# /etc/init.d/sendmail status #查看sendmail启动情况
sendmail dead but subsys locked #sendmail进程锁住,原因是postfix服务启动导致sendmail服务进程锁住,需要关闭postfix服务。
sm-client (pid 1759) is running...
[root@ssticentos65 ~]# /etc/init.d/postfix stop #暂停postfix服务提示失败,原因是postfix进程正在使用,需要使用kill命令杀掉postfix进程
Shutting down postfix: [FAILED]
[root@ssticentos65 ~]# /etc/init.d/postfix status #查看postfix服务可以查看到进程号
master (pid 1647) is running...
[root@ssticentos65 ~]# kill -9 1647 #杀掉postfix服务进程号
[root@ssticentos65 ~]# /etc/init.d/postfix status #查看postfix状态
master dead but pid file exists
[root@ssticentos65 ~]# chkconfig postfix off #设置postfix开机不启动
[root@ssticentos65 ~]# /etc/init.d/sendmail stop #暂停sendmail服务
Shutting down sm-client: [ OK ]
Shutting down sendmail: [FAILED]
[root@ssticentos65 ~]# /etc/init.d/sendmail start #启动sendmail服务
Starting sendmail: [ OK ]
Starting sm-client: [ OK ]
2、安装邮件发送工具mailx 。(邮件用户代理MUA)
[root@ssticentos65 ~]# yum -y install mailx #在线安装mailx
3、 配置mail
[root@ssticentos65 ~]# vim /etc/mail.rc
set from=XX@nnv5.cn ##设置发件人的邮箱地址
set smtp=smtp.exmail.qq.com ##设置发件人的smtp地址
set smtp-auth-user="XX@nnv5.cn" smtp-auth-password="XXXXXXX" ##设置发件的账号和密码(qq邮箱有可能会需要授权码,密码有时候不行)
set smtp-auth=login ##登录,默认即可