百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Nginx主备以及高可用架构

off999 2025-01-17 12:34 33 浏览 0 评论


一、双机主备模式

1、准备

主机

IP

作用

主机1

10.100.1.10

Nginx1

主机2

10.100.1.11

Nginx2

10.100.1.5

VIP


2、主备模式架构



3、keepalived

3.1、keppalived安装

[root@nginx1 ~]# yum install -y keepalived

[root@nginx2 ~]# yum install -y keepalived

3.2、修改keepalived配置

配置文件路径:
/etc/keepalived/keepalived.conf

nginx1配置(主节点)

global_defs { #全局配置

router_id lb01 #标识身份->名称

}


vrrp_instance VI_1 {

state MASTER #标识角色状态(主节点)

interface ens33 #网卡绑定接口

virtual_router_id 50 #虚拟路由id

priority 150 #优先级

advert_int 1 #监测间隔时间

authentication { #认证

auth_type PASS #认证方式

auth_pass 1111 #认证密码

}

virtual_ipaddress {

10.100.1.5 #虚拟的VIP地址

}

}


nginx2配置(备节点)


global_defs { #全局配置

router_id lb02 #标识身份->名称

}


vrrp_instance VI_1 {

state BACKUP #标识角色状态(备节点)

interface ens33 #网卡绑定接口

virtual_router_id 50 #虚拟路由id

priority 100 #优先级

advert_int 1 #监测间隔时间

authentication { #认证

auth_type PASS #认证方式

auth_pass 1111 #认证密码

}

virtual_ipaddress {

10.100.1.5 #虚拟的VIP地址

}

}

3.3、启动keepalived服务

[root@nginx1 ~]# systemctl start keepalived

[root@nginx1 ~]# systemctl enable keepalived


[root@nginx2 ~]# systemctl start keepalived

[root@nginx2 ~]# systemctl enable keepalived

3.4、测试

在nginx1上查看是否有VIP

[root@nginx1 ~]# ip addr | grep ens33

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

inet 10.100.1.10/8 brd 10.255.255.255 scope global ens33

inet 10.100.1.5/32 scope global ens33


关闭nginx1的keeplived,查看VIP是否会主动飘到nginx2

[root@nginx1 ~]# systemctl stop keepalived

[root@nginx2 ~]# ip addr | grep ens33

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

inet 10.100.1.11/8 brd 10.255.255.255 scope global ens33

inet 10.100.1.5/32 scope global ens33


启动nginx1的keepalived,查看nginx1是否会抢占VIP

[root@nginx1 ~]# systemctl start keepalived

[root@nginx1 ~]# ip addr | grep ens33

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

inet 10.100.1.10/8 brd 10.255.255.255 scope global ens33

inet 10.100.1.5/32 scope global ens33

3.5、配置nginx检测脚本

配置完keepalived之后,存在一个问题,就是如果挂的不是keepalived而是这台电脑上的Nginx的话,keepalived的转发就不会生效,因为它无法识别Nginx服务是否正常


解决方法:在keepalived.conf文件中配置对Nginx的定时检查,如果发现Nginx挂了,调用脚本重启Nginx

3.5.1、编辑脚本

vim /etc/keepalived/check_nginx.sh

#!/bin/bash

A=`ps -C nginx --no-header | wc -l`#判断nginx是否为启动,否,则启动nginx

if [ $A -eq 0 ];then


/usr/local/nginx/sbin/nginx #启动nginx

sleep 3 #等待3秒

if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then #启动失败的话,则停止keepalived服务

systemctl stop keepalived

fi

fi

3.5.2、增加运行权限

[root@nginx1 ~]# chmod a+x /etc/keepalived/check_nginx.sh

3.5.3、在keepalived配置文件中写入监听nginx脚本

vrrp_script check_nginx {

script "
/etc/keepalived/check_nginx.sh" #脚本

interval 2 #每隔两秒运行上一行的脚本

weight 10 #如果脚本运行失败,则升级权重+10

}




在vrrp_instance中新增监控的脚本

track_script {

check_nginx #追踪nginx脚本

}



4、nginx

4.1、nginx安装

安装依赖包

[root@nginx1 ~]# yum -y install pcre pcre-devel zlib zlib-devel openssl openssl-devel

上传源码包到tmp目录



解压该源码文件

[root@nginx1 tmp]# tar -zxvf nginx-1.20.0.tar.gz



进入到nginx-1.12.0目录,指定安装目录/usr/local/nginx

[root@nginx1 nginx-1.20.0]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module


编译安装

[root@nginx1 nginx-1.20.0]# make && make install

进入到/usr/local/nginx/sbin,执行./nginx启动nginx服务

[root@nginx1 sbin]# /usr/local/nginx/sbin/nginx

查看nginx是否启动成功

[root@nginx1 sbin]# ps -ef | grep nginx



4.2、测试

4.2.1、关闭nginx服务

关闭nginx服务,查看keepalived是否会将nginx启动

1)、执行命令/usr/local/nginx/sbin -s stop停止nginx服务

[root@nginx1 keepalived]# /usr/local/nginx/sbin/nginx -s stop



2)、执行命令ps -ef | grep nginx查看nginx服务是否启动

[root@nginx1 keepalived]# ps -ef | grep nginx



4.2.2、修改nginx配置

修改nginx配置,让nginx服务启动失败,查看keepalived是否会切换到备节点

1)、修改nginx配置



2)、执行命令停止nginx服务

[root@nginx1 keepalived]# ps -ef | grep nginx | grep -v nginx | awk '{print "kill -9",$2}' | sh

3)、执行命令ps -ef | grep nginx查看nginx服务是否启动,否,查看keepalived的状态



4)、查看keepalived的服务状态

[root@nginx1 keepalived]# systemctl status keepalived



5)、登录nginx2查看VIP是否飘到该服务器

[root@nginx2 ~]# ip addr | grep ens33



4.2.3、重新启动nginx服务

修改为正确的nginx配置,重新启动nginx服务,启动keepalived服务,查看VIP是否会重新飘到nginx1上面

1)、修改为正确的nginx配置后,启动nginx服务

[root@nginx1 keepalived]# /usr/local/nginx/sbin/nginx

2)、启动keepalived服务

[root@nginx1 keepalived]# systemctl start keepalived

3)、查看VIP是否重新飘到原先的服务器

[root@nginx1 keepalived]# ip addr | grep ens33



二、LVS+Keepalived+Nginx高可用

1、准备

主机

IP

作用

主机1

10.100.1.10

Keepalived Master

主机2

10.100.1.11

Keepalived Backup

主机3

10.100.1.12

Nginx1

主机4

10.100.1.13

Nginx2

10.100.1.5

VIP


2、高可用架构



3、keepalived

3.1、keppalived安装

[root@nginx1 ~]# yum install -y keepalived

[root@nginx2 ~]# yum install -y keepalived

3.2、修改keepalived配置

配置文件路径:
/etc/keepalived/keepalived.conf

lvs1配置(主节点)

global_defs { #全局配置

router_id lb01 #标识身份->名称

}


vrrp_instance VI_1 {

state MASTER #标识角色状态(主节点)

interface ens33 #网卡绑定接口

virtual_router_id 50 #虚拟路由id

priority 150 #优先级

advert_int 1 #监测间隔时间

authentication { #认证

auth_type PASS #认证方式

auth_pass 1111 #认证密码

}

virtual_ipaddress {

10.100.1.5 #虚拟的VIP地址

}

}

# 定义对外提供服务的LVS的VIP以及port

virtual_server 10.100.1.5 80 {

delay_loop 6 # 设置健康检查时间,单位是秒

lb_algo rr # 设置负载调度的算法为wlc

lb_kind DR # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式

nat_mask 255.255.255.0

persistence_timeout 0

protocol TCP

real_server 10.100.1.12 80 { # 指定real server1的IP地址

weight 3 # 配置节点权值,数字越大权重越高

TCP_CHECK {

connect_timeout 10

nb_get_retry 3

delay_before_retry 3

connect_port 80

}

}

real_server 10.100.1.13 80 { # 指定real server2的IP地址

weight 3 # 配置节点权值,数字越大权重越高

TCP_CHECK {

connect_timeout 10

nb_get_retry 3

delay_before_retry 3

connect_port 80

}

}

}


lvs2配置(备节点)

global_defs { #全局配置

router_id lb02 #标识身份->名称

}


vrrp_instance VI_1 {

state BACKUP #标识角色状态(备节点)

interface ens33 #网卡绑定接口

virtual_router_id 50 #虚拟路由id

priority 100 #优先级

advert_int 1 #监测间隔时间

authentication { #认证

auth_type PASS #认证方式

auth_pass 1111 #认证密码

}

virtual_ipaddress {

10.100.1.5 #虚拟的VIP地址

}

}

# 定义对外提供服务的LVS的VIP以及port

virtual_server 10.100.1.5 80 {

delay_loop 6 # 设置健康检查时间,单位是秒

lb_algo rr # 设置负载调度的算法为wlc

lb_kind DR # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式

nat_mask 255.255.255.0

persistence_timeout 0

protocol TCP

real_server 10.100.1.12 80 { # 指定real server1的IP地址

weight 3 # 配置节点权值,数字越大权重越高

TCP_CHECK {

connect_timeout 10

nb_get_retry 3

delay_before_retry 3

connect_port 80

}

}

real_server 10.100.1.13 80 { # 指定real server2的IP地址

weight 3 # 配置节点权值,数字越大权重越高

TCP_CHECK {

connect_timeout 10

nb_get_retry 3

delay_before_retry 3

connect_port 80

}

}

}

3.3、启动keepalived服务

[root@nginx1 ~]# systemctl start keepalived

[root@nginx1 ~]# systemctl enable keepalived


[root@nginx2 ~]# systemctl start keepalived

[root@nginx2 ~]# systemctl enable keepalived

4、LVS

4.1、ipvsadm安装

[root@lvs1 ~]# yum install -y ipvsadm

[root@lvs2 ~]# yum install -y ipvsadm

5、nginx

5.1、nginx安装

安装依赖包

[root@nginx1 ~]# yum -y install pcre pcre-devel zlib zlib-devel openssl openssl-devel

上传源码包到tmp目录



解压该源码文件

[root@nginx1 tmp]# tar -zxvf nginx-1.20.0.tar.gz



进入到nginx-1.12.0目录,指定安装目录/usr/local/nginx

[root@nginx1 nginx-1.20.0]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module


编译安装

[root@nginx1 nginx-1.20.0]# make && make install


进入到/usr/local/nginx/sbin,执行./nginx启动nginx服务

[root@nginx1 sbin]# /usr/local/nginx/sbin/nginx


查看nginx是否启动成功

[root@nginx1 sbin]# ps -ef | grep nginx



5.2、编写LVS的realserver的健康状态检测脚本

Nginx的两台机器都需要配置

1)、进入到init文件夹

[root@nginx1 ~]# cd /etc/init.d/

2)、编辑脚本realserver.sh

[root@nginx1 init.d]# vim realserver.sh

#虚拟的vip 根据自己的实际情况定义

SNS_VIP=10.100.1.5

/etc/rc.d/init.d/functions

case "$1" in

start)

ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP

/sbin/route add -host $SNS_VIP dev lo:0

echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce

echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

sysctl -p >/dev/null 2>&1

echo "RealServer Start OK"

;;

stop)

ifconfig lo:0 down

route del $SNS_VIP >/dev/null 2>&1

echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce

echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore

echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce

echo "RealServer Stoped"

;;

*)

echo "Usage: $0 {start|stop}"

exit 1

esac

exit 0

3)、设置脚本权限

[root@nginx1 init.d]# chmod +x realserver.sh

[root@nginx1 init.d]# chmod +x /etc/rc.d/init.d/functions

4)、执行脚本

[root@nginx1 init.d]# service realserver.sh start

5)、查看执行结果

[root@nginx1 init.d]# ip a

如果有显示VIP,则说明成功



6、测试

6.1、nginx测试

1)、测试VIP

ping 10.100.1.5



2)、网页测试VIP



6.2、keepalived高可用测试

在lvs1上查看是否有VIP

[root@lvs1 ~]# ip addr | grep ens33

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

inet 10.100.1.10/8 brd 10.255.255.255 scope global ens33

inet 10.100.1.5/32 scope global ens33


关闭lvs1的keeplived,查看VIP是否会主动飘到nginx2

[root@lvs1 ~]# systemctl stop keepalived

[root@lvs2 ~]# ip addr | grep ens33

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

inet 10.100.1.11/8 brd 10.255.255.255 scope global ens33

inet 10.100.1.5/32 scope global ens33


启动lvs1的keepalived,查看nginx1是否会抢占VIP

[root@lvs1 ~]# systemctl start keepalived

[root@lvs1 ~]# ip addr | grep ens33

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

inet 10.100.1.10/8 brd 10.255.255.255 scope global ens33

inet 10.100.1.5/32 scope global ens33

6.3、LVS监控测试

1)、查看最新的VIP对应的realserver的情况

[root@lvs1 keepalived]# ipvsadm -l

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP lvs1:http rr

-> 10.100.1.12:http Route 3 0 0

-> 10.100.1.13:http Route 3 0 0



查看到10.100.1.112和10.100.1.113两台服务器都在

2)、测试停掉10.100.1.112

[root@nginx1 ~]# /usr/local/nginx/sbin/nginx -s stop

3)、查看最新的VIP对应的realserver的情况

[root@lvs1 keepalived]# ipvsadm -l

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP lvs1:http rr

-> 10.100.1.13:http Route 3 0 0



可以查看到10.100.1.12这台服务器已经被移除了

4)、恢复10.100.1.12

lvs又会自动监控并加入10.100.1.12

[root@nginx1 ~]# /usr/local/nginx/sbin/nginx

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP lvs1:http rr

-> 10.100.1.12:http Route 3 0 0

-> 10.100.1.13:http Route 3 0 0


相关推荐

安装python语言,运行你的第一行代码

#01安装Python访问Python官方(https://www.python.org/),下载并安装最新版本的Python。确保安装过程中勾选“Addpython.exetoPAT...

Python推导式家族深度解析:字典/集合/生成器的艺术

一、为什么需要其他推导式?当你在处理数据时:o需要快速去重→集合推导式o要建立键值映射→字典推导式o处理海量数据→生成器表达式这些场景是列表推导式无法完美解决的,就像工具箱需要不同工...

别再用循环创建字典了!Python推导式让你的代码起飞

当同事还在用for循环吭哧吭哧创建字典时,我早已用推导式完成3个需求了!这个被90%新手忽视的语法,今天让你彻底掌握字典推导式的4大高阶玩法,文末彩蛋教你用1行代码搞定复杂数据转换!基础语法拆解#传...

什么是Python中的生成器推导式?(python生成器的好处)

编程派微信号:codingpy本文作者为NedBatchelder,是一名资深Python工程师,目前就职于在线教育网站Edx。文中蓝色下划线部分可“阅读原文”后点击。Python中有一种紧凑的语法...

Python 列表转换为字符串:实用指南

为什么在Python中将列表转换为字符串?Python列表非常灵活,但它们并非在所有地方都适用。有时你需要以人类可读的格式呈现数据——比如在UI中显示标签或将项目保存到CSV文件。可能还...

生成器表达式和列表推导式(生成器表达式的计算结果)

迭代器的输出有两个很常见的使用方式,1)对每一个元素执行操作,2)选择一个符合条件的元素子集。比如,给定一个字符串列表,你可能想去掉每个字符串尾部的空白字符,或是选出所有包含给定子串的字符串。列表...

python学习——038python中for循环VS列表推导式

在Python中,for循环和列表推导式(ListComprehension)都可以用于创建和处理列表,但它们的语法、性能和适用场景有所不同。以下是两者的详细对比:1.语法结构for循环使用...

python中列表推导式怎么用?(列表 python)

这个问题,我们不妨用近期很火的ChatGPT来试试,来看看人工智能是如何解答的?在Python中,列表解析是一种简洁的方法,用于生成列表。它是一种快速,简洁的方法,可以在一行代码中生成列表,而不需...

Python列表推导式:让你的代码优雅如诗!

每次写for循环都要三四行代码?处理数据时总被嵌套结构绕晕?学会列表推导式,一行代码就能让代码简洁十倍!今天带你解锁这个Python程序员装(偷)逼(懒)神器!一、为什么你需要列表推导式?代码...

python学习——038如何将for循环改写成列表推导式

在Python里,列表推导式是一种能够简洁生成列表的表达式,可用于替换普通的for循环。下面是列表推导式的基本语法和常见应用场景。基本语法result=[]foriteminite...

太牛了!Python 列表推导式,超级总结!这分析总结也太到位了!

Python列表推导式,超级总结!一、基本概念列表推导式是Python中创建列表的一种简洁语法,它允许你在一行代码内生成列表,替代传统的for循环方式。其核心思想是**"对可迭代对...

25-2-Python网络编程-TCP 编程示例

2-TCP编程示例应用程序通常通过“套接字”(socket)向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通信。Python语言提供了两种访问网络服务的功能。其中低级别的网络服...

python编程的基础与进阶(周兴富)(python编程基础视频)

前不久我发文:《懂了,if__name=='__main__'》。想不到的是,这个被朋友称之为“读晕了”的文章,其收藏量数百,有效阅读量竟然过万。所谓“有效阅读量”,就是读到尾部才退...

Python 闭包:深入理解函数式编程的核心概念

一、简介在Python编程领域,闭包(Closure)是一个既基础又强大的概念,它不仅是装饰器、回调函数等高级特性的实现基础,更是函数式编程思想的重要体现。理解闭包的工作原理,能够帮助开发者编写出...

Python小白逆袭!7天吃透PyQt6,独立开发超酷桌面应用

PythonGUI编程:PyQt6从入门到实战的全面指南在Python的庞大生态系统中,PyQt6作为一款强大的GUI(GraphicalUserInterface,图形用户界面)编程框架,为开...

取消回复欢迎 发表评论: