在开篇之前让我们先来了解下:什么是nginx?什么是nginx高可用?什么是nginx反向代理?nginx高可用是怎么做到得。带着等等一系列问题,开始我们今天得环境搭建。
nginx介绍
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。 因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
1,开篇之前准备工作:
1.1 服务器:
192.168.177.134
192.168.177.136
这里准备了两台虚拟机,安装了nginx
1.2 nginx版本
nginx version: nginx/1.20.1
2,nginx安装
2.1 nginx下载地址
wget http://nginx.org/download/nginx-1.20.1.tar.gz
2.2 解压nginx并安装
--进入服务安装包目录,这里放到了home/server cd /home/server/ --解压tar包 tar -zxvf nginx-1.20.1.tar.gz --进入解压nginx目录 cd nginx-1.20.1 --执行configure进行配置,这里配置可以根据自己项目需要进行自定义配置 ./configure --prefix=/usr/local/nginx --with-http_ssl_module --执行安装 make && make install
2.3 编译安装在执行./configure步骤报错,是因为缺少环境变量
checking for C compiler … not found ./configure: error: C compiler cc is not found
解决方法
yum -y install gcc yum -y install gcc-c++
2.4 PCRE报错问题
./configure: error: the HTTP rewrite module requires the PCRE library. You can either disable the module by using --without-http_rewrite_module option, or install the PCRE library into the system, or build the PCRE library statically from the source with nginx by using --with-pcre= option.
解决方法
yum -y install openssl openssl-devel
安装过程中需要安装相关依赖,安装报错得可以看下另一篇博客nginx安装教程,那里面有详细得安装过程,这个不是我们这篇得主题,以上操作安装之后就开始我们下面高可用之旅。
3 什么是高可用?
高可用HA(HighAvailability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。如果一个系统能够一直提供服务,那么这个可用性则是百分之百,但是天有不测风云。所以我们只能尽可能的去减少服务的故障。
3.1 本教程要解决的问题
在生产环境上很多时候是以Nginx来做反向代理对外提供服务,服务运行过程中Nginx难免会遇到故障,如:服务器宕机,服务不可用。当Nginx宕机那么所有对外提供的接口都将导致无法访问。
虽然我们无法保证服务器百分之百可用,但是也得想办法避免这种悲剧发生,今天我们主角keepalived,使用keepalived来实现Nginx的高可用。
3.2 双机热备
双机热备是国内企业中最为普遍的一种高可用方案之一,双机热备其实就是指一台服务器在提供服务,另一台为某服务的备用状态,当一台服务器不可用另外一台就会顶替上去。
3.3 keepalived介绍
Keepalived是Linux下一个轻量级别的高可用解决方案。高可用(High
Avalilability,HA),其实两种不同的含义:广义来讲,是指整个系统的高可用行,狭义的来讲就是之主机的冗余和接管,它与HeartBeat
RoseHA
实现相同类似的功能,都可以实现服务或者网络的高可用,但是又有差别,HeartBeat是一个专业的、功能完善的高可用软件,它提供了HA软件所需的基本功能,比如:心跳检测、资源接管,检测集群中的服务,在集群节点转移共享IP地址的所有者等等。HeartBeat功能强大,但是部署和使用相对比较麻烦,与HeartBeat相比,Keepalived主要是通过虚拟路由冗余来实现高可用功能,虽然它没有HeartBeat功能强大,但是Keepalived部署和使用非常的简单,所有配置只需要一个配置文件即可以完成
3.4 keepalived是什么?
keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。
后来Keepalived又加入了VRRP的功能,VRRP(Vritrual Router Redundancy
Protocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied
一方面具有服务器状态检测和故障隔离功能,另外一方面也有HA
cluster功能,关于VRRP协议实现的过程。可以查看keepalived官方文档
3.5 故障转移机制
Keepalived高可用服务之间的故障切换转移,是通过VRRP 来实现的。 在 Keepalived服务正常工作时,主 Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活着,当主Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的 IP资源及服务。
而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。
3.6 keepalived官方文档
文档地址: https://www.keepalived.org/manpage.html
3.7 keepalived安装
yum -y install keepalived
3.7.1 修改主机(192.168.177.134)keepalived配置文件
yum方式安装的会生产配置文件在/etc/keepalived下:
vi keepalived.conf
#检测脚本 vrrp_script check_http_port { script "/usr/local/src/check_nginx_pid.sh" #心跳执行的脚本,检测nginx是否启动 interval 2 #(检测脚本执行的间隔,单位是秒) weight 2 #权重 } #vrrp 实例定义部分 vrrp_instance VI_1 { state MASTER # 指定keepalived的角色,MASTER为主,BACKUP为备 interface ens33 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡 virtual_router_id 66 # 虚拟路由编号,主从要一直 priority 100 # 优先级,数值越大,获取处理请求的优先级越高 advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数) #授权访问 authentication { auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信 auth_pass 1111 } track_script { check_http_port #(调用检测脚本) } virtual_ipaddress { 192.168.177.135/32 # 定义虚拟ip(VIP),可多设,每行一个 } }
virtual_ipaddress 里面可以配置vip,在线上通过vip来访问服务。
interface 需要根据服务器网卡进行设置通常查看方式ip addr
authentication 配置授权访问后备机也需要相同
3.7.2修改备机(192.168.177.135)keepalived配置文件
vi keepalived.conf
keepalived.conf:
#检测脚本 vrrp_script check_http_port { script "/usr/local/src/check_nginx_pid.sh" #心跳执行的脚本,检测nginx是否启动 interval 2 #(检测脚本执行的间隔,单位是秒) weight 2 #权重 } #vrrp 实例定义部分 vrrp_instance VI_1 { state BACKUP # 指定keepalived的角色,MASTER为主,BACKUP为备 interface ens33 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡 virtual_router_id 66 # 虚拟路由编号,主从要一直 priority 99 # 优先级,数值越大,获取处理请求的优先级越高 advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数) #授权访问 authentication { auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信 auth_pass 1111 } track_script { check_http_port #(调用检测脚本) } virtual_ipaddress { 192.168.177.135/32 # 定义虚拟ip(VIP),可多设,每行一个 } }
3.7.3 检测脚本:
#!/bin/bash A=`ps -C nginx --no-header |wc -l` if [ $A -eq 0 ];then /usr/local/nginx/sbin/nginx if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then killall keepalived fi fi
创建完脚本进行授权:chmod 775 check_nginx_pid.sh
说明:check_nginx_pid脚本需要授权,不然没有权限调用,在这里我们两台服务器执行,我们在生产环境是直接通过vip来访问服务。
3.8 启动keepalived
systemctl start keepalived.service
4,模拟nginx服务器故障
通过模拟nginx服务器故障来测试环境搭建是否成功
4.1 模拟nginx故障:
4.1.1 第一步我们通过修改两台服务器nginx得html页面来进行测试:
4.1.2 访问192.168.177.134来查看效果:
4.1.3 访问192.168.177.136来查看效果:
4.1.4 通过192.168.177.135 vip进行访问,查看效果:
访问192.168.177.135,通过vip进行访问,页面显示得192.168.177.136;这说明当前是由136服务器对外提供服务。
4.1.5 登录192.168.177.136服务器执行命令:
/usr/local/nginx/sbin/nginx -s stop
再次访问 192.168.177.135 发现这个时候页面显示的还是: 192.168.177.136 ,这是脚本里面自动重启。
4.1.6 现在直接将 192.168.177.136 服务器关闭
再次访问192.168.177.135现在发现页面显示192.168.177.134这个时候keepalived就自动故障转移了,一套企业级生产环境的高可用方案就次就搭建好了。