1、keepalived实现nginx高可用
1.1 nginx监控脚本
该脚本检测ngnix的运行状态,如果nginx服务挂了则直接停止keepalived,准备让其它机器接管。
/etc/keepalived/check_nginx.sh :
#!/bin/bash
# 如果进程中没有nginx则将keepalived进程kill掉
A=`ps -C nginx --no-header |wc -l` ## 查看是否有 nginx进程 把值赋给变量A
if [ $A -eq 0 ];then ## 如果没有进程值得为 零
service keepalived stop ## 则结束 keepalived 进程
fi
1.2 keepalived.conf配置
! Configuration File for keepalived
global_defs {
notification_email {
774626778@qq.com
}
notification_email_from Alexandre.Cassen@firewall.loc
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 BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_nginx
}
virtual_ipaddress {
192.168.153.200
}
}
在其它备机BACKUP上,只需要改变 state MASTER -> state BACKUP,priority 100 -> priority 99即可。
service keepalived restart
1.3 nginx+keepalived高可用测试
跳转到nginx启动目录下执行命令:sbin/nginx -s stop,模拟主机的nginx服务挂了,
查看keepalived服务发现没有被杀死。
VIP地址没有切换到备份机
2、问题分析
nginx_check.sh脚本手动执行没有问题。keepalived、nginx、nginx_check.sh 配置文件都检查了很久没问题。
通过百度查找,发现keepalived配置文件里写了这个vrrp_script,大括号需要换行执行,否则不起作用。
keepalived.conf配置文件改为:
vrrp_script check_nginx
{
script "/etc/keepalived/check_nginx.sh" ##监控脚本
interval 2 ##时间间隔,2秒
weight -5 ##权重
}
重启keepalived测试,发现VIP仍然没有切换到备份机上。
后来想一下,会不会是nginx_check.sh脚本的编码格式出现问题?
使用:set ff 查看nginx_check.sh脚本格式,发现当前脚本格式是dos。
使用:set fileformat=unix修改脚本格式,再查看脚本格式为:
再重启keepalived,测试发现问题解决。
注意:如果使用Notepad++的NppFTP插件修改服务器的sh文件时,要注意文件的编码格式。