使用Keepalived 实现Nginx 双机热备 #
2021-12-01 20:05
Nginx 安装 #
首先准备两台服务器,上面均部署Nginx。
参考这里 Linux 的 Nginx 安装【转】
Keepalived 安装 #
yum install -y keepalived
Keepalived 配置 #
简单模式 #
目录 /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
#路由id,全局唯一,表示当前keepalived节点的唯一性
router_id keep_15
}
vrrp_instance VI_1 {
#设置当前实例状态为MASTER。MASTER代表是主实例,BACKUP代表是备用实例
state BACKUP
#当前实例绑定的网卡
interface eth0
#当前实例的虚拟路由id,一组主备的实例的路由id是相同的
virtual_router_id 101
#当前实例的优先级
priority 100
#主备之间同步检查时间间隔
advert_int 1
#一组主备实例的认证密码,方式非法节点进入路由组
authentication {
auth_type PASS
auth_pass 123456Qw
}
#设置当前实例的虚拟IP
virtual_ipaddress {
192.168.137.101 dev eth0
}
}
主备的Nginx 服务器上,均使用该配置,调整router_id即可。网卡名eth0记得跟改为服务器上的网卡名。
重启Keepalived:systemctl restart keepalived。轮流关闭Keepalived,可以发现虚拟IP192.168.137.101在两台主机上进行漂移。
应对主备机某些情况下单机不可用的情况,Keepalived 这样已经够用了。任意机器挂掉,都能保障192.168.137.101是可用的。
有时候,我们还想使用脚本做一些更高阶的操作。比如说,Keepalived 定时检查业务进程,如果进程挂掉尝试重启,重启失败则主动kill 自身,让虚拟IP 飘逸到另外一台机器上。可以参考如下配置。
增加check 操作的模式 #
首先,我们增加在/data/sh下增加一个脚本文件:check_nginx.sh
#!/bin/bash
status=$(ps -C nginx --no-heading|wc -l)
if [ "${status}" = "0" ]; then
/usr/sbin/nginx
status2=$(ps -C nginx --no-heading|wc -l)
if [ "${status2}" = "0" ]; then
systemctl stop keepalived
fi
fi
该脚本的工作就是检查Nginx 进程是否存在,不存在则尝试重启,重启失败则停止Keepalived。
然后,我们调整/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
# 路由id,全局唯一,表示当前keepalived节点的唯一性
router_id keep_14
# 执行script 的用户
script_user root
}
vrrp_script chk_nginx {
script "/data/sh/check_nginx.sh"
# 5秒检查一次
interval 5
# 每次操作可以增减权重,这里我们置为0,先不使用
weight 0
}
vrrp_instance VI_1 {
#设置当前实例状态为MASTER。MASTER代表是主实例,BACKUP代表是备用实例
state BACKUP
#当前实例绑定的网卡
interface eth0
#当前实例的虚拟路由id,一组主备的实例的路由id是相同的
virtual_router_id 101
#当前实例的优先级
priority 100
#主备之间同步检查时间间隔
advert_int 5
#一组主备实例的认证密码,方式非法节点进入路由组
authentication {
auth_type PASS
auth_pass 123456Qw
}
#设置当前实例的虚拟IP
virtual_ipaddress {
192.168.137.101 dev eth0
}
track_script {
chk_nginx
}
}
这个配置有两个地方要注意的。
script_user:执行脚本的用户,这里简单设置为了root。为了安全起见,可以专门增加一个别的用户来执行脚本。- 关闭
selinux,如不关闭,查看/var/log/messages会看到这么一个错误:Unable to access script- 手动关闭setlinux:
setenforce 0 - 永久关闭,修改文件
/etc/sysconfig/selinux:SELINUX=disabled
- 手动关闭setlinux:
好了,重启Keepalived,即可看到效果了:关闭Nginx,几秒后,Nginx 就被重启起来了。
SELinux(Security-Enhanced Linux) 是 美国国家安全局(NSA)对于 强制访问控制的实现,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统。
SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则)。