Keepalived实现Nginx(Docker)高可用
1、在两台服务器上准备Docker的Nginx容器
随便拉一个版本的nginx
docker pull nginx:1.12.2
创建nginx容器
docker run -d --name nginx:1.12.2
创建/mydata/nginx/conf
目录,并将nginx容器中的nginx.conf文件拷贝到该路径下,修改目录权限
mkdir -p /mydata/nginx/conf
docker cp nginx:/etc/nginx/nginx.conf /mydata/nginx/conf
chmod 777 /mydata/nginx
停止并删除nginx容器
docker stop nginx
docker rm nginx
创建nginx容器,并将容器中的文件挂载出来
docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-d nginx:1.12.2
关闭服务器防火墙或者开放80端口
2、安装Keepalived
keepalived安装在服务器上,不要用docker安装
yum安装keepalived
yum install -y keepalived
验证是否安装成功
rpm -q -a keepalived
编辑/etc/keepalived/keepalived.conf
配置文件
! Configuration File for keepalived
# 公共配置
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.56.101 # 服务器ip
smtp_connect_timeout 30
router_id LVS_DEVEL
}
# 检查nginx状态的脚本,健康监测脚本
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh" # 脚本路径
interval 2 # 脚本执行间隔时间,单位秒,每隔2秒执行一次健康监测脚本
weight 2
}
vrrp_instance VI_1 {
state MASTER # 主机使用: MASTER 备机使用: BACKUP
interface eth1 # 实例绑定的网卡, 用ip a命令查看网卡编号
virtual_router_id 51 # 虚拟路由标识,主、备服务器ID必须一样
priority 100 # 优先级,备份服务上将100改为小于100,可配置成90
advert_int 1 # 主备之间同步检查的时间间隔单位秒
authentication { # 验证类型和密码
auth_type PASS # 验证类型有两种 PASS和HA
auth_pass 1111 # 验证密码,在一个实例中主备密码保持一样
}
virtual_ipaddress { # 虚拟IP地址,可以有多个,每行一个,不需要指定端口,端口使用的是Nginx容器的端口
192.168.56.50 # VRRP H 虚拟地址
}
track_script { # 调用上边的脚本
chk_http_port
}
}
编辑/usr/local/src/nginx_check.sh
健康监测脚本
#!/bin/bash
#version 0.0.1
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then # eq 0 表示nginx服务未启动
docker restart nginx # 判断nginx是否能重启
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
systemctl stop keepalived # 停止服务器上的keepalived,启用备用服务器
fi
fi
启动keepalived
systemctl start keepalived.service
3、验证nginx高可用
1、访问http://192.168.56.50/,可以访问到nginx主页
2、停止主服务器上的nginx容器docker stop nginx
,2秒之后再查看docker运行的容器docker ps
,发现nginx容器还在运行,是因为keepalived发现nginx停止运行后,重启了nginx容器
3、停止主服务器上的keepalivedsystemctl stop keepalived.service
,使用ps -ef | grep keepalived
命令确认是否已停止,访问http://192.168.56.50/,发现还可以访问到,是因为备用服务器被启用
参考博文:http://t.zoukankan.com/peterzhang123-p-14691762.html