前言:在上一篇博客里面简单的使用docker完成了nginx的反向代理和负载均衡,当我们通过访问nginx服务器去真正的web服务器正常的情况下一点问题都没有,但是一旦nginx服务器由于不可控的原因挂掉了,而且在生产环境上,那就是灾难性的故障,所以给nginx服务器做热备还是非常有必要的。本次试验的简单架构如下(PS:由于换了台新电脑,画图软件还没装,手画一个将就着来吧)。本次试验的硬件设备信息如下,两台nginx+keepalived服务器(192.168.169.137主、192.168.169.131从),两台web服务器(192.168.169.133、192.168.169.134)。四台机器均为VMware中的虚拟机,系统为centos7.5。
本篇博客在拜读过某位大神的文章后才写出的,链接:https://blog.51cto.com/andyxu/2286045。做人得诚实,哈哈
1、搭建准备工作
1、配置nginx两台服务器时间同步
为啥还有配置两台服务器的时间同步嘞?
在服务器集群中时间不同步有可能会让一些应用程序运行混乱,造成不可预知的问题,比如Hbase,当时间差别过大时就会挂掉。具体的详细知识大家可以自行search。
1、在nginx主备机上安装ntp,命令为yum -y install ntp
2、在nginx的主机(nginx-master)上修改ntp.conf文件的配置,具体在机器的/etc目录下。
在配置文件中添加以下两行命令
server 127.127.1.0 iburst local clock #添加使用本地时间
restrict 192.168.169.0 mask 255.255.255.0 nomodify #允许更新的IP地址段
192.168.169.0是我的虚拟机网段,这点注意。
3、在nginx-master上面启动ntp服务,并设置开机自启动
systemctl start ntpd
systemctl enable ntpd
4、 在nginx-master上添加防火墙策略
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.169.131" port protocol="udp" port="123" accept"
firewall-cmd --reload
作用就是让备机同步主机的时间
5、在nginx-slave上同步nginx-master的时间,命令为ntpdate 192.168.169.137
2、下载并配置nginx(见上篇博客)
3、下载并配置keepalived
以下安装操作在nginx的主备机上进行
1、安装环境
yum install wget make gcc gcc-c++ openssl-devel
2、新建一个keepalived文件夹,这个自行定义,我的目录/opt/keepalive
3、下载keepalived安装包
wget http://www.keepalived.org/software/keepalived-2.0.7.tar.gz
确保机器联网呦。。。
4、解压
tar zxvf keepalived-2.0.7.tar.gz
cd keepalived-2.0.7
5、指定编译时存放路径
./configure --prefix=/opt/keepalive
如果报以下警告:
*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.
不用担心,我们只需要用到VRRP功能,不需要用IPVS功能,所以请确保以下三项是yes就行了。
Use VRRP Framework : Yes
Use VRRP VMAC : Yes
Use VRRP authentication : Yes
6、编译、安装
make
make install
7、将keepalived以服务的方式启动
mkdir /etc/keepalived
cp /data/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
systemctl enable keepalived #开机自启动
8、修改keepalived的配置文件
vim /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.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_pid.sh" # 检查nginx状态的脚本
interval 2
weight 3
}
vrrp_instance VI_1 {
state MASTER #备份服务器上将MASTER改为BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.169.130
}
track_script {
chk_nginx
}
}
}
9、添加检查nginx状态的脚本
vim /etc/keepalived/nginx_pid.sh
#!/bin/bash
#version 0.0.1
#
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
systemctl restart docker
sleep 3
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
systemctl stop keepalived
fi
fi
脚本说明:当nginx进程不存在时,会自动重启docker服务,docker服务启动时会自动启动nginx容器;再次检查nginx进程,如果不存在,就停止keepalived服务,然后NGINX_BACKUP主机会自动接替NGINX_MASTER的工作。chmod +x /etc/keepalived/nginx_pid.sh
10、配置防火墙允许vrrp协议
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.169.131" protocol value="vrrp" accept"
firewall-cmd --reload
这是nginx主机上的防火墙策略,备机则开放主机的策略。
4、启动测试
1、启动keepalived,systemctl start keepalived
2、检查启动状态,systemctl status keepalived
3、观察虚拟IP是否正常,ip add
4、通过虚拟IP访问项目
我访问的是130的虚拟IP,8080是nginx容器对外暴露的端口。
5、nginx和keepalived关闭测试
关闭nginx-master机器上的nginx容器,发现又自动重启了,说明启动脚本没问题
关闭nginx-master机器上的keepalived服务,发现虚IP被绑定到了备机上,服务也能正常访问
到这在centos7下使用docker部署nginx服务,实现了反向代理、负载均衡,再配合keepalived就实现了双机热备高可用。在学习和写博客的过程中也学习借鉴了其他大神的经验。生命不息,学而不止,敬开源,哈哈哈!!