Nginx如果宕机了怎么办,访问所有请求全部会404,如果这时有一台Nginx充当备用机,当主Nginx宕机后,用户会访问备用机。这样就实现了Nginx的高可用(High Available)。
- keepAlived
- 解决单点故障
- 可以实现高可用HA机制
- 基于VRRP协议(虚拟路由冗余协议)
当与主机间检测不到心跳包是会连击到备用机
--
keepAlived的安装
- 通过https://www.keepalived.org/download.html 官网下载
- 上传到服务器
- 解压 tar -zxvf keepalived-2.2.2.tar.gz
- 删除 rm -f keepalived-2.2.2.tar.gz
- cd keepalived-2.2.2/
- yum -y install libnl libnl-devel
- ./configure --prefix=/usr/local/keepalived --sysconf=/etc
- make && make install
keepAlived配置介绍
global_defs { # 全局配置
# 邮箱配置 开始 不需要可删除
notification_email { #通知email 当主节点发生故障 发送e-mail
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc # 指定发件人
smtp_server 192.168.200.1 #指定smtp服务器地址
smtp_connect_timeout 30 #指定smtp连接超时时间
# 邮箱配置 结束
#路由id:当前安装keepalived节点主机的标志符,全局唯一
router_id keep_198
# 下面4个一般不配置 直接删除
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
这是节点信息
vrrp_instance VI_1 {
state MASTER #当前keep_198节点状态 MASTER主节点 BACKUP 备用机
interface eth0 # 当前实例绑定的网卡名称
# 保证主备节点一致即可
virtual_router_id 51
#优先级/权重 在主节点宕机后根据优先级来获取备用节点
priority 100
#主备节点之间心跳包发送间隔1s
advert_int 1
#认证授权的密码 防止非法节点进入
authentication {
auth_type PASS
auth_pass 1111
}
#虚拟ip
virtual_ipaddress {
192.168.0.161
}
}
真正有用的配置就这些
global_defs {
router_id keep_198
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.161
}
}
- 启动
进入keepalived文件夹下面的sbin目录 ./keepalived - 执行 ip addr 发下eth0下面绑定了两个ip一个是
192.168.0.198/24 还有一个是 192.168.0.161/32
备用机keepalived配置
global_defs {
router_id keep_199
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.161
}
}
- 此时当主节点宕机后,备用机会自动升至为主节点,当主节点成功启动后,备用机会自动降为备用节点。
当只有Nginx挂掉时,会出现无法访问的问题
- keepalived需要检测nginx是否可以访问,如果无法访问,尝试重启,如果一致失败则切换到备用机。需要在/etc/keepalived下新建一个check_nginx.sh的脚本文件
- yum install psmisc -y 否则没有killall命令
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
# 判断nginx是否宕机,如果宕机了,尝试重启
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
# 等待一小会再次检查nginx,如果没有启动成功,则停止keepalived,使其启动备用机
sleep 3
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
- chmod +x check_nginx.sh
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh" #shell命令或脚本路径
interval 1 # 间隔时间,单位为秒,默认1秒
weight -80 # 权重,这个值会与定义的优先级做加法例:-80时则为priority+(-80)
fall 3 #脚本几次失败转换为失败
rise 5 # 脚本连续监测成果后,把服务器从失败标记为成功的次数
timeout 2 # 超时时间
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.161
}
track_script {
check_nginx
}
}
- 关闭nginx和keepalived,启动keepalived然后nginx会自动重启