Linux部署nginx+keepalived 主备模式及双主模式
前言
在互联网的高可用性服务中,单一的服务节点往往无法满足业务对稳定性和可用性的要求。双机热备是一种常见的高可用性解决方案,它通过两台服务器同时运行相同的服务,并使用 Keepalived 来实现故障转移,确保在主服务器发生故障时,备服务器能够立即接管服务,从而保证服务的连续性。本文将详细介绍如何在 Nginx 环境中部署双机热备方案。
环境准备
- 两台 Linux 服务器(本文为 192.168.239.130 和 192.168.239.131)
- Nginx 服务器软件
- Keepalived 软件
- 两个不同的虚拟 IP 地址(VIP,本文假设为 192.168.239.200 和 192.168.239.201)
高可用有2种方式
1、Nginx+keepalived 主从配置
这种方案,使用一个vip地址,前端使用2台机器,一台做主,一台做备,但同时只有一台机器工作,另一台备份机器在主机器不出现故障的时候,永远处于浪费状态,对于服务器不多的网站,该方案不经济实惠。
2、Nginx+keepalived 双主配置
这种方案,使用两个vip地址,前端使用2台机器,互为主备,同时有两台机器工作,当其中一台机器出现故障,两台机器的请求转移到一台机器负担,非常适合于当前架构环境。
一、安装 Nginx 和 Keepalived
在两台服务器上分别安装 Nginx 和 Keepalived。
1、安装 Nginx
分别在两台服务器上安装Nginx,可以移步:https://www.cnblogs.com/luotengteng/p/19033287
2、安装Keepalived
使用以下命令安装keepalived
sudo yum install -y keepalived systemctl enable keepalived
二、Nginx+keepalived 主从配置
配置 Keepalived:
1、主节点配置(192.168.239.130)
编辑主节点的 Keepalived 配置文件:
sudo vim /etc/keepalived/keepalived.conf
修改配置内容如下:
# 定义chk_http_port脚本,脚本执行间隔10秒,权重-5,检测nginx服务是否在运行。有很多方式,比如进程,用脚本检测等等
vrrp_script chk_http_port {
#这里通过脚本监测
script "/etc/keepalived/nginx_check.sh"
#脚本执行间隔,每2s检测一次
interval 2
#脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
weight -5
#检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
fall 2
#检测1次成功就算成功。但不修改优先级
rise 1
}
#定义vrrp实例,VI_1 为虚拟路由的标示符,自己定义名称,keepalived在同一virtual_router_id中priority(0-255)最大的会成为master,也就是接管VIP,当priority最大的主机发生故障后次priority将会接管
vrrp_instance VI_1 {
#指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器。注意这里的state指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,
#但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,
#那么他会就回抢占为MASTER
state MASTER
#指定HA监测网络的接口。与本机 IP 地址所在的网络接口相同,可通过ip addr 查看
interface ens33
#虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
virtual_router_id 51
#定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级
priority 100
#设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
advert_int 1
#设置验证类型和密码。主从必须一样
authentication {
#设置vrrp验证类型,主要有PASS和AH两种
auth_type PASS
#设置vrrp验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
auth_pass 1111
}
#VRRP HA 虚拟地址 如果有多个VIP,继续换行填写
#设置VIP,它随着state变化而增加删除,当state为master的时候就添加,当state为backup的时候则删除,由优先级决定
virtual_ipaddress {
192.168.239.200
}
}
Nginx检测脚本如下:
在/etc/keepalived下创建一个nginx_check.sh脚本文件(主从都需要这个文件)
vi /etc/keepalived/nginx_check.sh
添加内容:
#!/bin/bash A=`ps -C nginx --no-header | wc -l` if [ $A -eq 0 ];then /usr/local/nginx/sbin/nginx #尝试重新启动nginx sleep 2 #睡眠2秒 if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then killall keepalived #启动失败,将keepalived服务杀死。将vip漂移到其它备份节点 fi fi
2、备用节点配置(192.168.112.131)
编辑主节点的 Keepalived 配置文件:
vrrp_script chk_http_port {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.239.200
}
}
3、启动 Keepalived
分别启动keepalived
sudo systemctl start keepalived
查看主节点服务器:已经绑定虚拟VIP 192.168.239.200

查看备用节点服务器:并没有绑定虚拟VIP 192.168.239.200

4、验证
1、VIP验证
停止主节点的 Keepalived 服务:
sudo systemctl stop keepalived
然后在备节点上查看 VIP 已经漂移到备节点:

2、浏览器访问验证
在客户端访问 http://192.168.239.200:8088/,服务正常

可能遇到的问题:keepalived出现主备机同时绑定vip。
keepalived启动之后,主机与备份机都绑定了虚拟ip,也就是产生了所谓的“脑裂”现象。
问题解决过程:
首先在130主机上用tcpdump抓包,监控一下ens33,也就是绑定了vip的网卡的报文,发现如下:
tcpdump -i ens33 vrrp -n

130(主机)和131(备份机)两台机器在轮询往224.0.0.18(vrrp的组播地址)发送报文。理论上来说,主机处于活跃状态的时候,备份机收到报文之后是不会发送组播消息的,这个很明显就是备份机没收到主机的组播报文。再三检查之后,确定配置没问题,所以就把问题锁定在主备机与组播ip之间的通信问题上。
运行以下命令:
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT firewall-cmd --reload
其中INPUT 0 --in-interface ens33这段的ens33是绑定了vip的网卡,替换成自己的网卡就可以了。
三、Nginx+keepalived 双主模式配置
只需要在主从配置下,更改下keepalived配置文件即可,配置文件实例如下:
新增虚拟VIP:192.168.239.201,作为103服务器的备用VIP,作为131服务器的主VIP。
130的keepalived配置文件内容如下:
vrrp_script chk_nginx_port {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.239.200
}
track_script{
chk_nginx_port
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 52
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.239.201
}
track_script{
chk_nginx_port
}
}
131 的keepalived配置文件内容如下:
vrrp_script chk_nginx_port {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.239.200
}
track_script{
chk_nginx_port
}
}
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.239.201
}
track_script{
chk_nginx_port
}
}
分别重启keepalived后查看虚拟ip。
查看130的虚拟ip:已经成功添加192.168.239.200

查看131的虚拟ip:已经成功添加192.168.239.201

将130的keepalived停掉,可以看到两个虚拟ip都飘到131上,反之停掉131也一样。

客户端访问验证:
正常情况下访问不同的虚拟IP,将会访问其所在master上的nginx;当其中一台发生故障时,另一台接管发生故障服务器的公网虚拟IP(这时由非故障机器一台负担两个不同VIP所有的请求)


四、常见故障排查
(1)VIP 无法正常绑定
- 检查网络接口名称是否正确(interface ens33需与实际接口一致)
- 确认两台服务器的virtual_router_id是否相同
- 检查防火墙是否允许 VRRP 协议通信(UDP 112 端口)
- 执行ip addr show查看 VIP 是否被正确绑定
(2)Nginx 故障时 Keepalived 未切换
- 检查check_nginx.sh脚本是否有执行权限
- 通过/var/log/messages查看 Keepalived 日志,确认是否检测到 Nginx 故障
- 手动执行check_nginx.sh脚本,查看是否能正确停止 Keepalived
- 确认track_script配置是否正确关联到检查脚本
(3)双主架构中 VIP 抢占异常
- 检查是否配置了nopreempt参数且state为BACKUP
- 确认两台服务器的优先级配置是否正确(主节点优先级高于从节点)
- 检查网络延迟是否过高,导致心跳包丢失
(3)Nginx 代理返回 502 错误
- 检查后端 Web 服务器是否正常运行
- 查看 Nginx 错误日志(/usr/local/nginx/logs/error.log)
- 确认upstream配置中的服务器 IP 和端口是否正确
- 检查 Web 服务器防火墙是否允许 Nginx 服务器访问
五、生产环境最佳实践
(1)硬件配置建议
- Nginx 服务器:4 核 CPU、8GB 内存、100GB SSD 硬盘
- Web 服务器:根据业务需求调整,建议至少 2 核 CPU、4GB 内存
- 网络:千兆网卡,交换机支持组播转发
(2)监控体系搭建
- 使用 Prometheus+Grafana 监控 Nginx 和 Keepalived 状态
- 监控指标包括:CPU 使用率、内存占用、磁盘空间、网络流量、Nginx 请求数、Keepalived 状态
- 设置告警阈值,当指标异常时及时通知运维人员
(3)定期维护计划
- 每周进行一次架构切换测试,确保故障切换正常
- 每月更新服务器系统补丁,修复安全漏洞
- 每季度检查硬件状态,更换老化部件
- 每年重新评估架构性能,根据业务增长调整配置
(4)灾备方案扩展
- 跨机房部署 Nginx+Keepalived 架构,实现异地容灾
- 使用 DNS 轮询结合 Keepalived,实现多机房流量分发
- 对重要数据进行异地备份,确保数据可靠性
六、 架构扩展方案
(1)增加 Nginx 服务器节点
- 在双主架构基础上,添加更多 Nginx 节点,形成多主多备架构
- 使用 DNS 轮询或更高层的负载均衡设备分发流量到多个 VIP
- 调整 Keepalived 配置,实现多节点之间的故障切换
(2)集成 Haproxy 实现四层负载均衡
- 在 Nginx 前端部署 Haproxy,实现 TCP 层负载均衡
- Haproxy 监控 Nginx 服务器状态,当某台 Nginx 故障时自动剔除
- 配置 Haproxy 的健康检查机制,确保流量只转发到正常工作的 Nginx 节点
(3)容器化部署
- 将 Nginx 和 Keepalived 打包为 Docker 容器,便于部署和管理
- 使用 Kubernetes 管理容器集群,实现自动扩缩容和故障转移
- 通过 Service 和 Ingress 资源暴露服务,实现高可用架构
参考资料:https://lexang.blog.csdn.net/article/details/52386909
https://blog.csdn.net/yunyingxia/article/details/148650699

浙公网安备 33010602011771号