安装nginx+keepalived主要是防止nginx单点故障,keepalived可以有效监测nginx单点故障并热备切换到其他节点。
本文所用的实验环境是:
虚拟机安装ubuntu14.04 64位desktop版,在上面安装了docker1.9.1
docker中生成镜像版本为 centos最新版
nginx版本为 1.8.0 源码编译
keepalived 版本为:1.2.20
所用到相关库为:
zlib 1.2.11
perl 5.24
openssl为1.9版本
其他安装中需要的工具 比如gcc g++等请根据需要安装。
实验步骤:
在docker下run centos最新进行镜像,进入容器时使用命令 docer exec -ti [镜像名称或者id] /bin/bash
此处如果不加后面的/bin/bash,会在启动service相关命令时报总线执行错误。
(1) 编译安装nginx ,解压源码,编译安装nginx不在赘述。
(2) 编译安装Keepalived
cd /usr/local/src
tar -zxvf keepalived-1.2.20.tar.gz
cd keepalived-1.2.20
./configure --prefix=/usr/local/keepalived
make && make install
(3)将 keepalived 安装成 Linux 系统服务(因为没有使用 keepalived 的默认路径安装(默认是/usr/local),安装完成之后,需要做一些工作)
#复制默认配置文件到默认路径
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
#复制 keepalived 服务脚本到默认的地址
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/sbin/keepalived /usr/sbin/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
(4)设置 keepalived 服务开机启动
chkconfig keepalived on
(5) 修改keepalived配置文件
修改master的配置文件
! Configuration File for keepalived
global_defs {
notification_email {
****@example.com #邮箱可以配置
****@example.com #邮箱可以配置
}
notification_email_from itsection@example.com
smtp_server mail.example.com
smtp_connect_timeout 30
router_id LVS_DEVEL #表示节点id 可以修改 比如 nodeA nodeB
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" #执行一段监测nginx进程是否正常如果不正常尝试启动
interval 2
weight -5
fall 3
rise 2
}
vrrp_instance VI_1 {
state MASTER #标识该节点是master 还是backup
interface eth0 #该处必须是ifconfig之后得到的网卡名称
mcast_src_ip 172.17.0.2 #当前节点ip
virtual_router_id 2 #虚拟节点id 与backup的需保持一致
priority 101 #优先级,master的优先级数值要大于backup
advert_int 2
authentication {
auth_type PASS #相关授权 可以配置,也可不修改
auth_pass 1111
}
virtual_ipaddress {
172.17.0.210 #虚拟节点ip ,需要配置,这样在网关处可以访问该ip 用来跳转到某一个节点
}
track_script {
chk_nginx #调用执行脚本的函数,上面已经定义该函数
}}
(6)编写 Nginx 状态检测脚本 /etc/keepalived/nginx_check.sh
!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx #nginx所在的启动bin文件
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fifi
(7) 赋予该脚本执行权限
chmod +x /etc/keepalived/nginx_check.sh
(8) 修改backup的配置文件
如果是按照docker方式构建容器,只需要将刚才的master容器提交到镜像,无需再次安装nginx和keepalived服务。
docker commit d6567f3effad matthew:v_1
然后再run该镜像生成容器
docker run --privileged -tid --name matthew01 matthew:v_1 /usr/sbin/init
docker ps -a 看一下该容器是否生成,容器生成后可以执行
docker exec -ti matthew01 /bin/bash 进入到该容器
进入到keepalived配置文件目录 修改该配置文件为BACKUP配置文件
! Configuration File for keepalived
global_defs {
notification_email {
****@example.com #邮箱可以配置
****@example.com #邮箱可以配置
}
notification_email_from itsection@example.com
smtp_server mail.example.com
smtp_connect_timeout 30
router_id LVS_DEVEL #表示节点id 可以修改 比如 nodeA nodeB
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" #执行一段监测nginx进程是否正常如果不正常尝试启动
interval 2
weight -5
fall 3
rise 2
}
vrrp_instance VI_1 {
state BACKUP #标识该节点是master 还是backup
interface eth0 #该处必须是ifconfig之后得到的网卡名称
mcast_src_ip 172.17.0.3 #当前节点ip
virtual_router_id 2 #虚拟节点id 与backup的需保持一致
priority 100 #优先级,master的优先级数值要大于backup
advert_int 2
authentication {
auth_type PASS #相关授权 可以配置,也可不修改
auth_pass 1111
}
virtual_ipaddress {
172.17.0.210 #虚拟节点ip ,需要配置,这样在网关处可以访问该ip 用来跳转到某一个节点
}
track_script {
chk_nginx #调用执行脚本的函数,上面已经定义该函数
}}
需要修改的地方 橙色标出,已经修改为backup配置。
(9)测试keepalived可用性
修改nginx 默认访问页面index.html 加上当前机器的ip地址,这样便于在浏览器访问时定位到是哪台机器在提供服务。
通过两个容器中输入 ip add
观察虚拟ip是否已经产生
红色框中的ip为keepalived中配置的虚拟ip,如果你的配置中未有虚拟ip出现,说明你的配置有问题 两台nginx无法通信。
可用通过浏览器访问该虚拟ip看看页面跳转到哪个页面
通过停止某一台机器的keepalived服务和nginx服务,用来测试热备是否能及时切换。
至此 docker下构建keepalived服务实验结束。
文章参考了部分有关keepalived的配置,引文如下
https://www.centos.bz/2017/08/nginx-keepalived-web-ha/