Nginx+Keepalive实现高可用
Posted 诺浅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
主备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
随便加一点东西
访问192.168.85.131看看效果
6、启动KV和nginx
systemctl restart nginx
systemctl restart keepalived
7、测试
-
访问192.168.85.50,可以看到nginx的主页,说明搭建成功。
-
停止主机上的KV,
systemctl stop keepalived
,继续访问192.168.85.50,显示备机页面,说明备机自动切换为主机了。
-
启动主机的KV,再次访问192.168.85.50又能看到主页,说明主机启动之后又成为了主机,备机自动下位(图就不放了,类似的)
-
停止主机的Nginx,
systemctl stop nginx
,会发现Nginx又会被重启。说明脚本执行成功了。
8、其他
查看kv的日志
tail -f /var/log/messages|grep Keepalived
查看VIP是否绑定成功
ip address
参考
https://blog.csdn.net/J080624/article/details/107024434
以上是关于Nginx+Keepalive实现高可用的主要内容,如果未能解决你的问题,请参考以下文章
keepalive高可用nginx(nginx动静分离)的实现