前言

在项目中为了提高并发,一般会采用集群部署,集群部署之后前端就需要一个总的代理,简单的架构图如下

Nginx+Keepalive实现高可用_服务器

由于Nginx的性能很高,一般中小型公司的流量使用单节点的Nginx,后面挂服务集群这种简单的架构都能扛得住。

当然也可以部署多个Nginx,每个Nginx使用一个公网IP,然后使用DNS轮询机制来做负载均衡,但这样会造成公网IP的浪费,且DNS的实时性不高。或者可以采用Nginx集群前面再挂一个统一的入口LVS。

不管你是使用统一的入口LVS还是采用Nginx,为了避免公网IP的浪费,你始终需要对外提供一个统一的入口,所以很多中小公司都会采用单节点的nginx来作为外网的统一入口,但很明显这样会存在单节点故障问题,那么就需要一套机制来保证系统的正常访问。

其主要思路是


使用主备Nginx,当主Nginx出现问题时,备Nginx能立马接替主Nginx,继续对外提供服务。这整套的恢复流程是自动化的,不需要人工参与的。


而keepalive就是实现这个自动化的一个工具

Nginx+Keepalive架构和思路

Nginx+Keepalive之后主备的架构图如下,以下简称Keepalive为KV

Nginx+Keepalive实现高可用_nginx_02

主备KV共享一个虚IP,或者叫VIP,我这里的例子这个VIP为:192.168.85.50,用户访问VIP时默认优先访问到主KV的机器,当主KV宕机时,备KV自动切换为主,用户访问VIP时又会访问这台备KV

安装配置Nginx+KV(基于centos8)

准备两台centos8的服务器,我这里的地址为(192.168.85.130(主),192.168.85.131(备)),执行以下步骤

1、关闭防火墙、关闭selinux

# 查看防火墙状态
firewall-cmd --state

# 关闭防火墙
systemctl stop firewalld.service

# 关闭开机自动启动
systemctl disable firewalld.service

关闭selinux参考:https://blog.csdn.net/J080624/article/details/79571986

2、安装keepalived,nginx

yum -y install keepalived
yum -y install nginx

3、编辑主keepalice配置文件

vi /etc/keepalived/keepalived.conf

为以下内容

global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.85.130 #这里修改为本机IP
smtp_connect_timeout 30
router_id LVS_DEVEL
script_user root
enable_script_security
}
#添加检测脚本
vrrp_script chk_http_port {
script "/usr/local/nginx/nginx_check.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state MASTER #主机这里是MASTER 从机是BACKUP
interface ens33 #网卡
virtual_router_id 51 # 主、从机的virtual_router_id必须相同
priority 100 # 主备机取不同的优先级,主机优先级大
advert_int 1 #心跳检测间隔时间
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.85.50
}
track_script {
chk_http_port
}
}

3、编辑备keepalice配置文件

bal_defs {
notification_email { #指定keepalived在发生事件时(比如切换)发送通知邮件的邮箱
acassen@firewall.loc #设置报警邮件地址,可以设置多个,每行一个。 需开启本机的sendmail服务
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc #keepalived在发生诸如切换操作时需要发送email通知地址
smtp_server 192.168.85.131 #指定发送email的smtp服务器
smtp_connect_timeout 30 #设置连接smtp server的超时时间
router_id LVS_DEVEL #运行keepalived的机器的一个标识,通常可设为hostname。故障发生时,发邮件时显示在邮件主题中的信息。
}
vrrp_script chk_http_port {
script "/usr/local/nginx/nginx_check.sh"
interval 2 #检测脚本执行间隔时间
weight 2 #设置当前服务器权重增量
}
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.85.50
}
track_script {
chk_http_port
}
}

5、在主和备上都创建nginx脚本文件

vi /usr/local/nginx/nginx_check.sh
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
systemctl restart nginx
sleep 2
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
systemctl stop keepalived
fi
fi

设置脚本的权限

chmod 744 /usr/local/nginx/nginx_check.sh

其语义为每2秒检测一次nginx进程的存在状态,如果不存在就尝试重新启动nginx,然后睡眠2秒再次检测,如果nginx进程还是不存在说明没有启动成功,这个时候就终止keepalived服务,主kv终止后备kv就会上位,这时,流量就会被备机nginx接收。

6、修改备nginx的首页以便在访问主机和备机时能够加以区分

cd /usr/share/nginx/html
vi index.html

随便加一点东西

Nginx+Keepalive实现高可用_nginx_03

访问192.168.85.131看看效果

Nginx+Keepalive实现高可用_keepalive_04

6、启动KV和nginx

systemctl restart nginx
systemctl restart keepalived

7、测试



访问192.168.85.50,可以看到nginx的主页,说明搭建成功。
Nginx+Keepalive实现高可用_服务器_05



停止主机上的KV,​​systemctl stop keepalived​​,继续访问192.168.85.50,显示备机页面,说明备机自动切换为主机了。
Nginx+Keepalive实现高可用_单节点_06



启动主机的KV,再次访问192.168.85.50又能看到主页,说明主机启动之后又成为了主机,备机自动下位(图就不放了,类似的)



停止主机的Nginx,​​systemctl stop nginx​​,会发现Nginx又会被重启。说明脚本执行成功了。



8、其他

查看kv的日志

tail -f /var/log/messages|grep Keepalived

查看VIP是否绑定成功

ip address