当前位置: 首页 > news >正文

Linux部署nginx+keepalived 主备模式及双主模式

一、安装 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 #尝试重新启动nginxsleep 2 #睡眠2秒if [ `ps -C nginx --no-header | wc -l` -eq 0 ];thenkillall 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 

image

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

image

4、验证

1、VIP验证

停止主节点的 Keepalived 服务:

sudo systemctl stop keepalived

然后在备节点上查看 VIP 已经漂移到备节点:

image

 2、浏览器访问验证

在客户端访问 http://192.168.239.200:8088/,服务正常

image

 

可能遇到的问题:keepalived出现主备机同时绑定vip。

keepalived启动之后,主机与备份机都绑定了虚拟ip,也就是产生了所谓的“脑裂”现象。

问题解决过程:
首先在130主机上用tcpdump抓包,监控一下ens33,也就是绑定了vip的网卡的报文,发现如下:

tcpdump -i ens33 vrrp -n

image

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 2weight -5fall 2rise 1
}vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.239.200}track_script{chk_nginx_port}
}vrrp_instance VI_2 {state BACKUPinterface ens33virtual_router_id 52priority 90advert_int 1authentication {auth_type PASSauth_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 2weight -5fall 2rise 1
}vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 51priority 90advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.239.200}track_script{chk_nginx_port}
}vrrp_instance VI_2 {state MASTERinterface ens33virtual_router_id 52priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.239.201}track_script{chk_nginx_port}
}

分别重启keepalived后查看虚拟ip。

查看130的虚拟ip:已经成功添加192.168.239.200

image

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

image

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

image

 客户端访问验证:

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

image

image

 至此,nginx+keepalived主备模式及双主模式已经部署完成。

 

参考资料:https://lexang.blog.csdn.net/article/details/52386909

 

http://www.sczhlp.com/news/11233/

相关文章:

  • Adobe Acrobat Pro 2025 v25.001.20623 (macOS, Windows) - 创建、转换和编辑 PDF
  • ipv6
  • 学习笔记:SQL_trace开启对SQL语法的trace
  • 读书笔记:数据库锁定机制:如何避免数据冲突
  • mysql8.0使用Percona-Server审计插件报错解决办法libstdc++.so.6: version `CXXABI_1.3.9 not found
  • 故障处理:troubleshooting row cache lock
  • Abogen - 强大的文本转语音工具,轻松将电子书转换为高质量有声书
  • DDS-TSN到底是如何实现的?
  • Perforce P4 DAM - 2D/3D视觉数字资产管理系统
  • 半模态对话框bindSheet的isShow属性
  • 2025年8月13日
  • 分布式数据高效可靠检索新方法
  • 完全免费还能私有化部署?现在的国产低代码平台太香了!
  • Selenium定位
  • Java方法(重载→递归)+数组
  • AI Compass前沿速览:RynnVLA视觉-语言-动作模型、GLM-4.5V 、DreamVVT虚拟换衣、 WeKnora框架、GitMCP、NeuralAgent桌面AI助手
  • 微分方程的应用(第12版)- A First Course in Differential Equations with Modeling Applications
  • react 同步更新状态
  • CF1408D Searchlights
  • 题解:SP707 TFSETS - Triple-Free Sets
  • Vue 命名规范指南
  • mq bug 处理
  • 从训练到推理:Intel Extension for PyTorch混合精度优化完整指南
  • Window系统怎么设置定时关机
  • node 运行项目报超内存
  • 如何恢复被删除的日志文件以追踪攻击者
  • 3.浮点数及其应用
  • Qt事件过滤器之eventFilter函数返回值
  • Ubuntu系统小优化
  • ARM CPU的 intrinsics指令集 - svsel_u32