1、通过keeaplived使得nginx实现主备功能
1.1本试验采用四台主机,主机环境均为centos7,架构如下图所示
![](https://i-blog.csdnimg.cn/blog_migrate/3103f630f4f653cbd0b07d01851d345b.png)
1.2主机配置如下表所示
名称 | 地址 | 端口 |
代理服务器(主) | 10.1.60.114 | 80 |
代理服务器(备) | 10.1.60.115 | 80 |
后端服务器1 | 10.1.60.80 | 8081 |
后端服务器2 | 10.1.60.81 | 8081 |
vip虚拟地址 | 10.1.60.116 | |
公网服务 |
1.3所有主机关闭防火墙(disable为移除防火墙命令)
systemctl stop firewalld
systemctl disable firewalld
1.4所有主机关闭selinux
setenforce 0
1.5通过yum命令在主备代理服务器上安装keepalived
yum -y install keepalived
![](https://i-blog.csdnimg.cn/blog_migrate/4d84e8412b5eede5d298c3bc72b1c8f3.png)
1.6查看keepalived的配置文件位置
rpm -ql keepalived |grep conf
![](https://i-blog.csdnimg.cn/blog_migrate/b5329a077e28bbc14b0ba8631474d29a.png)
1.7对主节点keepalived配置文件进行如下配置
! Configuration File for keepalived
global_defs {
script_user root #配置vrrp_script项检测脚本,就必须增加此项与下面一项,不然会报错
enable_script_security #
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id nginx01 #主节点id需要与备节点id不一致
#vrrp_skip_check_adv_addr
#vrrp_strict
#vrrp_garp_interval 0
#vrrp_gna_interval 0
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh" #心跳执行的脚本,检查nginx是否存活
interval 5 #脚本执行的间隔时间,需要比advert_int时间大,单位是s
}
vrrp_instance VI_1 {
state MASTER #指定实例初始状态,主节点配置为master
interface ens160 #主机使用的网卡名称
virtual_router_id 51 #设置VRID标记,需要和备节点的id一致,多个集群不能重复(0..255)
priority 100 #优先级,主节点优先级需要比备节点高
advert_int 1 #检查的时间间隔,默认1s
authentication {
auth_type PASS #认证方式,支持PASS和AH,官方建议使用PASS
auth_pass 1111 #认证密码,备节点跟主节点一致
}
virtual_ipaddress {
10.1.60.116 #虚拟ip地址,必须配置为没有使用的地址
}
track_script {
check_nginx
}
}
1.8对备节点keepalived配置文件进行如下配置
! Configuration File for keepalived
global_defs {
script_user root
enable_script_security
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id nginx02
#vrrp_skip_check_adv_addr
#vrrp_strict
#vrrp_garp_interval 0
#vrrp_gna_interval 0
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 5
}
vrrp_instance VI_1 {
state BACKUP
interface ens160
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.1.60.116
}
track_script {
check_nginx
}
}
1.9check_nginx脚本为nginx的监测脚本,检测nginx是否存活去判断是否停用此设备的keepalived,来达到主备切换的目的,脚本如下所示
#!/bin/bash
nginx_nb=`netstat -lnpt|grep nginx|wc -l` #统计nginx调用的端口数目,wc -l为统计行数
nginx_nbb=`ps -ef|grep nginx|grep -v grep|grep -v check|wc -l` #统计nginx进程数目,此命令也可作为判断nginx是否存活,grep -v 为剔除名字匹配的进程
if [ $nginx_nb -eq 0 ];then #判断是否等于0,若等于0证明nginx挂掉了,若不等于0则nginx存活
systemctl start nginx #尝试启动nginx
sleep 2 #休眠2s
if [ $nginx_nbb == 0 ];then #再次判断nginx是否存活
systemctl stop keepalived #停止keepalived服务
#killall keepalived #杀掉所有关于keepalived的进程,需要额外安装psmisc插件
fi
fi
1.10给检测脚本赋予执行权限
chmod +x /etc/keepalived/check_nginx.sh
1.11主备节点启动nginx服务与keepalived服务
systemctl start nginx
systemctl start keelived
1.12启动完成后,主节点ens160网卡下会有虚拟ip
![](https://i-blog.csdnimg.cn/blog_migrate/16c3b3f5629217cb76840f1d1585d775.png)
1.13当主节点nginx节点出问题时,会自动停止keepalived,vip地址将切换到备节点上(此处编辑错误的nginx配置文件,重启nginx,使得nginx启动失败)
![](https://i-blog.csdnimg.cn/blog_migrate/996c7943696f6948262708719ad7b5aa.png)
![](https://i-blog.csdnimg.cn/blog_migrate/80ec6262f2f56c1618a99c0cf750c8c2.png)
2、通过keeaplived使得nginx实现双主功能
2.1使用主备时,只有主节点nginx在接受请求,备节点nginx一直处于空闲状态,只有等主节点挂了,备节点才会接收请求,这就使得资源浪费,所以在主备的基础上升级为双主,使得两台nginx主机都能接收请求
2.2在以上主节点的配置文件末尾增加以下配置
vrrp_instance VI_2 { #增加新的组名为VI_2
state BACKUP #节点改为BACKUP
interface ens160
virtual_router_id 52 #router_id改为52
priority 90 #权重降为90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.1.60.117/24 #虚拟ip改为10.1.60.117
}
}
2.3在以上备节点的配置文件末尾新增以下配置
vrrp_instance VI_2 {
state MASTER
interface ens160
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.1.60.117/24
}
}
2.4主备节点重新启动keepalived服务
systemctl restart keepalived
2.5现主备节点都有一个虚拟ip地址,实现了双主功能
![](https://i-blog.csdnimg.cn/blog_migrate/452faeed237d3e071d668e8e5ff7b3ad.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0a40870cd134679b0783e3eebbc4a264.png)
2.6两个节点中有其中一个节点nginx服务挂了,节点本身的虚拟ip会转到另一个节点上
当115节点nginx服务挂掉时
![](https://i-blog.csdnimg.cn/blog_migrate/44691065fa021c5a975011b6850cf4c9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/108aee8700a5d7bebe6b546e518e4727.png)
当114节点nginx服务挂掉时
![](https://i-blog.csdnimg.cn/blog_migrate/c6b8e703647105ccc6db75c92444eb05.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b7eafcbb524dfc822fecbb33c239a25a.png)
2.7 114节点nginx配置(在生产上两个节点都指向同一个后端服务实现负载加高可用架构,通过防火墙去配置两个节点的虚拟ip映射到公网ip上,再通过公网ip绑定域名,防火墙的nat服务也有负载均衡功能)
upstream demo_server {
server 10.1.60.80:8081;
server 10.1.60.81:8081;
}
server {
listen 80;
server_name www.apex.com;
location / {
proxy_pass http://demo_server;
}
}
2.8 115节点nginx配置
upstream demo_server {
server 10.1.60.80:8081;
server 10.1.60.81:8081;
}
server {
listen 80;
server_name www.apex.com;
location / {
proxy_pass http://demo_server;
}
}