今天使用keepalived+nginx搭建了主备nginx,记录下搭建过程和出现的问题。
一、nginx编译安装
之前写过nginx编译安装的内容可以参考:nginx编译安装参考
二、keepalived编译安装
1.官网下载地址:keepalived官网下载地址

直接选择自己需要的版本下载。
2.编译安装:
上传下载下来的压缩包到服务器目录:

解压文件:
bash
tar -zxvf keepalived-2.3.4.tar.gz

进入解压后的目录:
bash
cd keepalived-2.3.4

编译keepalived:
bash
./configure --prefix=/data/edwuser/keepalived2.3.4
--prefix=/data/edwuser/keepalived2.3.4参数指定编译目录
安装keepalived
bash
make && make install
安装结束后会在prefix指定目录生成文件夹。

进入安装目录的etc/keepalived会看到一个配置文件的模板文件keepalived.conf.sample

三、编辑自己的配置文件
使用这个文件为模板,配置我们自己的配置文件,先介绍下配置文件中几个模块和含义(网上随便搜):
***基础三个模块,global_defs全局模块,vrrp_instance配置vip模块,vrrp_script 脚本模块,用来检测nginx服务。
注:vrrp_script定义脚本后,在vrrp_instance模块必须加上track_script 参数。我就入了这个坑,导致脚本不生效。
global_defs模块参数
notification_email : keepalived在发生诸如切换操作时需要发送email通知地址,后面的 smtp_server 相比也都知道是邮件服务器地址。也可以通过其它方式报警,毕竟邮件不是实时通知的。
router_id : 机器标识,通常可设为hostname。故障发生时,邮件通知会用到。
vrrp_instance模块参数
state : 指定instance(Initial)的初始状态, MASTER 或者BACKUP,不是唯一性的,跟后面的优先级priority参数有关。
interface : 实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的,(注意自己系统,我的默认是ens33,有的是eth0)
mcast_src_ip : 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在那个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址
virtual_router_id : 这里设置VRID,这里非常重要,相同的VRID为一个组,他将决定多播的MAC地址
priority: 设置本节点的优先级,优先级高的为master(1-255)
advert_int : 检查间隔,默认为1秒。这就是VRRP的定时器,MASTER每隔这样一个时间间隔,就会发送一个advertisement报文以通知组内其他路由器自己工作正常
authentication : 定义认证方式和密码,主从必须一样
virtual_ipaddress : 这里设置的就是VIP,也就是虚拟IP地址,他随着state的变化而增加删除,当state为master的时候就添加,当state为backup的时候删除,这里主要是有优先级来决定的,和state设置的值没有多大关系,这里可以设置多个IP地址
track_script: 引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。
vrrp_script模块参数
告诉 keepalived 在什么情况下切换,所以尤为重要。可以有多个 vrrp_script
script : 自己写的检测脚本。也可以是一行命令如killall -0 nginx
interval 2: 每2s检测一次
weight -5 : 检测失败(脚本返回非0)则优先级 -5
fall 2: 检测连续 2 次失败才算确定是真失败。会用weight减少优先级(1-255之间)
rise 1 : 检测 1 次成功就算成功。但不修改优先级
版权声明:本文为CSDN博主「the丶only」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_52270081/article/details/118341576***
根据大佬的解释来配置自己的配置文件:
bash
主节点配置文件
global_defs {
router_id Nginx_01
script_security USER [user]
}
vrrp_script check_nginx {
script "/data/edwuser/keepalived2.3.4/etc/keepalived/check_nginx.sh"
interval 2
weight -60
fall 3
rise 2
user [user]
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass [password]
}
virtual_ipaddress {
[vip]
}
unicast_peer {
[备节点ip]
}
accept
track_script {
check_nginx
}
}
备节点配置文件
global_defs {
router_id Nginx_02
script_security USER [user]
}
vrrp_script check_nginx {
script "/data/edwuser/keepalived2.3.4/etc/keepalived/check_nginx.sh"
interval 2
weight -5
fall 3
rise 2
user [user]
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass [password]
}
virtual_ipaddress {
[vip]
}
unicast_peer {
[主节点ip]
}
accept
track_script {
check_nginx
}
}
由于是主备两个节点,所以要在两台服务器安装keepalived。安装步骤都一样,但是配置文件略有不同。
配置文件不同:
1.vrrp_instance VI_1中的 priority :
这个值表的是两台服务区的权重,主节点的权重要大于备用节点的权重。所以主节点权重我配置的150,备用节点配置的100.
2.vrrp_script check_nginx中的weight:
这个值表示当检查nginx状态出现问题的时候,给当前节点的权重值改变量。由于主节点的权重为150给weight主节点配置值为-60,当主节点的检查nginx脚本出现问题,也就是nginx宕机的时候。给当前权重150-60 = 90
所以90小于备用节点的100,所以会切换到备用节点。
3.unicast_peer指定单播ip:这个值是主备节点的通信ip。在我一开始没有配置这个ip,keepalived使用默认的组播。两个节点无论如何都没法通信。查看日志一直报错收不到信息。在配置后,keepalived会使用指定的ip进行通信。
配置文件注意点:
1.执行用户配置:
global_defs中的script_security USER [user]
vrrp_script check_nginx中的user [user]
这两个参数指定了check_nginx的脚本执行用户。如果不指定的话,keepalived会默认使用keepalived_script用户执行脚本,如果你没有创建过这个用户则会无法执行成功脚本。出现ip漂移等各种问题。

2.权重配置:
上面写过就是关于主节点和备用节点vrrp_instance VI_1中的 priority 和vrrp_script check_nginx中的weight
四、编写自己的nginx检测脚本
bash
#!/bin/bash
pidof nginx >/dev/null 2>&1
netstat -tlnp | grep -q ":8020"
if [ $? -eq 0 ]; then
exit 0
else
exit 1
监控nginx进程和我们用到的端口,如果有问题则返回1没问题则返回0。
五、修改启动脚本启动keepalived
在编译安装后,系统的/usr/lib/systemd/system/文件夹会生成systemctl启动使用的脚本。

在脚本启动后面增加参数,指定我们的配置文件。
bash
-f /data/edwuser/keepalived2.3.4/etc/keepalived/keepalived.conf

到这里就基本准备完成了。
使用systemctl命令启动keepalived
bash
sudo systemctl start keepalived
日志查看命令:
bash
sudo grep -i "vrrp\|received advertisement\|MASTER\|BACKUP" /var/log/messages
这个是系统中的日志,其实可以指定输出到自己的日志文件但是我偷懒了。
下面是我测试的日志,当我把主节点nginx关闭以后,看日志可以发现主节点权重从150变成90。90小于100的备用节点权重,所以vip转移到备用节点。当我把主节点启动起来,主节点权重从90变成150.vip又会绑定回来。
