通过前几节课程,我们已经对nginx的基本配置,使用nginx能够实现的功能,包括反向代理、负载均衡、动静分离等进行了讲解。本次课程继续nginx入门的重要知识点,即nginx的高可用性配置。
众所周知,网络设备、服务器、应用、数据库等的规划建设时,必须要考虑软硬件系统的冗余度和高可用性,避免出现单点故障的情况,以下通过一张网络规划拓扑图,来展示网络设计规划中的冗余特性。
图1
图中我们可以看到,网络设备都是采用双机部署的形式,那么即使通过双机部署,也仅仅是完成了物理意义上的冗余,如何做到双机主-备、主-主等形式对外提供服务,并且双机能够实时感知到对端的状态,从而在主机(本文均已主-备形式讨论)发生故障时,备机能够快速感知,并自动切换。这就需要不同的协议和配置来实现,针对不同设备、不同服务,所采用的主备高可用性技术也完全不同,以下列举常用的主备技术:
1.交换机:堆叠、M-LAG、VSS等;
2.路由器(网关):VRRP、HSRP等;
3.防火墙、负载均衡等:通过设备厂商自身的HA心跳线感知状态,通过设定好的协议或算法执行主备切换;
4.服务器:一般采用双机做网卡绑定bond的方式;
5.数据库:例如oracle数据库使用RAC做集群,mysql使用像keepalived、MHA等工具实现集群。
一、Nginx主备高可用性
通过nginx代理服务器,可以对后端的具体应用实现反向代理或负载均衡等功能,并且nginx可以对应用进行健康检查,将故障节点从负载均衡池中排出,从而实现对后端应用的高可用性保障。
但是,如果nginx服务器出现问题,则无法对外提供服务:
图2
因此,我们要考虑到nginx服务的高可用性,采用主-备,或主-主的形式安装部署nginx服务,nginx的主备高可用性,依靠keepalived组件实现:
图3
主机不仅负责对后端两台服务进行健康检查,并且对外提供服务,接受客户端的请求,如图中红线所示;备机尽对后端服务进行健康检查,不对外提供服务,当主机故障发生切换时,才接管工作,如图中紫线所示:
图4
客户端访问nginx服务器集群的虚拟IP。
综上所述,nginx的主备高可用性需要:(1)两台nginx服务器;(2)keepalived组件;(3)对外提供服务的虚拟IP地址。
二、配置高可用的准备工作
1.所需资源:
(1)需要两台nginx服务器:192.168.116.11和192.168.116.14;
(2)在两台服务器上安装nginx服务;
(3)在两台服务器上安装keepalived组件。
图5
2.安装所需资源
(1)Nginx具体安装过程,请查阅之前课程,结果如下:
图6
(2)通过yum方式安装keepalived组件:
命令:yum install keepalived,如图所示:
图7
安装完成后,路径为/etc/keepalived,并且生成配置文件,查看安装结果以及安装位置:
图8
三、高可用性配置
1.修改高可用keepalived组件的配置文件:
编辑keepalived.conf文件,修改相关参数如下,按照如下配置,只保留以下内容就可以:
! Configuration File for keepalived
#全局定义
global_defs {
router_id NodeA #设备标识
script_user root #赋予检测脚本的权限
enable_script_security
}
vrrp_script chk_nginx
{
script "/etc/keepalived/nginx_check.sh" #健康检查nginx状态的脚本文件
interval 2 #检测脚本执行的间隔时间
weight 2
}
#虚拟IP的配置
vrrp_instance VI_1 {
state MASTER #服务器属性(主/备)
interface ens33 #网卡名称
virtual_router_id 50 #主备机的虚拟路由器ID即VRRP-ID必须相同
priority 250 #主备机配置不同优先级,主机优先级>备机优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.116.15/24 #对外服务的VRRP虚拟IP地址
}
track_script { #调用健康监测模板,一定要放在vip的配置下面
chk_nginx
}
}
查看网卡信息:ifconfig,以及稍后查看连接情况:netstat
如果发现你的linux服务器没有ifconfig命令,则需要通过yum安装net-tools服务,以下是安装方法:
图9
图10
2.新建对nginx的健康检查脚本文件
该脚本文件的作用是,探测nginx进程是否存在,如果不存在,则尝试启动nginx,启动不成功后,则停止keepalived服务,让服务切换到备份服务器。
在/etc/keepalived路径新建nginx_check.sh脚本文件如下:
#!/bin/bash
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
then
/usr/local/nginx/sbin/nginx #以上作用:如果进程没有nginx,则启动
sleep 5 #间隔时间
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
then
killall keepalived #以上作用:如果进程没有nginx,则停止keepalived
fi
fi
第一个大坑预警!!
做这个实验,一共卡了我半天的时间,这里是一个大坑,编辑完此脚本文件,尝试执行,发现有报错:
图11
因为在dos/window下按一次回车键实际上输入的是“回车(CR)”和“换行(LF)”,而Linux/unix下按一次回车键只输入“换行(LF)”,所以修改的sh文件在每行都会多了一个CR,所以Linux下运行时就会报错找不到命令。
编辑文件,查看编码类型:
图12
发现编码为dos:
图13
将编码修改为unix即可解决问题:
图14
如果使用的linux系统没有查看进程的命令,则通过yum安装的方式,安装psmisc服务:
图15
3.启动服务
启动nginx以及keepalived:systemctl start keepalived.service
注意两台都需要启动。
图16
通过log查看启动过程,以及vrrp选取主备的结果等:
图17
通过log我们可以看到keepalived的启动过程,其实本质就是用的vrrp,至于vrrp什么原理,他其实是网络工程上,路由器或者交换机配置网关虚拟化的常用协议:
两台设备,通过比较优先级,选取主设备,并且将虚拟出来的地址应用在这台主设备上,通过双方HA的探测,感知对方状态。
具体想了解的,可以私信我,我讲一下VRRP的原理。
第二个大坑预警!!
上述log第二个红圈部分,可以看到,keepalived配置文件中,所配置的nginx进程检测脚本没有执行成功。
研究了半天,真的是半天!!
反复对比过脚本是不是配错了,多个空格,少个括号什么的,然后上网搜。。。都是一些扯淡的答案,最后发现,还是我技艺不精,linux好久不用都生疏了。
查看检测脚本nginx_check.sh的属性,发现,他没有执行的权限,他竟然没有执行的权限!!
图18
心态直接爆炸!!把权限修改后,再次重新启动,所有问题顺利解决,心情大好!
图19
可以看到,脚本已经帮我把nginx启动了。
查看网卡生成的虚拟ip地址:192.168.116.15:
图20
4.验证服务
通过浏览器访问虚拟地址,http://192.168.116.15,可以看到能够正常打开nginx网页:
图21
查看两台服务器的tcp连接情况,发现始终只有主节点192.168.116.11存在80端口的http连接,备份服务器则没有,使用命令:netstat -an | grep 192.168.116.15:80
图22
5.双机切换验证
停止主服务器nginx服务:
图23
可以看到nginx服务还是启动状态,查看log,我们发现,是keepalived的探测脚本,在检测到nginx进程停止后,重新启动了nginx进程:
图24
这次直接把nginx铲了!
不过做之前,切记备份一下,或者做个快照,生产环境还是不要这样测试了。。
图25
铲!
图26
然后将nginx进程kill掉:
图27
查看log,发现keepalived探测失效后,进程已经关闭:
图28
再次打开网页http://192.168.116.15,发现正常访问,查看备份服务器192.168.116.16,看到vrrp虚地址,以及http连接均切换到了该服务器:
图29
经过不懈努力,终于大功告成,建议各位小伙伴,研究nginx之前,一定要打好linux的基础,要不然,学起来会很痛苦!!!
本系列nginx入门课程已经全部结束了,接下来会以一个网络工程师的角度,陪同大家学习python,希望继续关注和支持我,谢谢!
----------------------------------------------------------------------
我是CCIE_佟老板,一个让你沉溺于网络学习世界的好伙伴。