部署nginx+keepalived

1、软件版本:

nginx-1.12.2.tar.gz

keepalived-1.2.23.tar.gz

2、上传软件包到/root路径下

3、准备依赖包

yum -y install gcc pcre-devel zlib-devel openssl-devel nmap

4、安装nginx

tar zxvf nginx-1.12.2.tar.gz
cd nginx-1.12.2
./configure --with-http_stub_status_module
make && make install

5、安装keepalived

tar zxvf keepalived-1.2.23.tar.gz 
cd keepalived-1.2.23
./configure
make && make install

6、拷贝/usr/local/etc和/usr/local/sbin下面文件到/etc和/usr/sbin下对应路径

cp -a /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
cp -a /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
mkdir /etc/keepalived
cp -a /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
cp -a /usr/local/sbin/keepalived /usr/sbin/

7、开机运行(nginx会被keepalived脚本拉起来)

systemctl enable keepalived.service

检查

systemctl is-enabled keepalived.service
chkconfig --list

8、配置nginx

两台接入服务器的nginx的配置完全一样,主要是配置/usr/local/nginx/conf/nginx.conf的http。

其中多域名指向是通过虚拟主机(配置http下面的server)实现;

同一域名的不同虚拟目录通过每个server下面的不同location实现;

到后端的服务器在http下面配置upstream,然后在server或location中通过proxy_pass引用。

要实现前面规划的接入方式,http的配置如下:

worker_processes  8;
events {
    worker_connections  10240;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream esb-socket {
        server 192.168.1.59:12345;
        server 192.168.1.84:12345;
        server 192.168.1.87:12345;
    }
    server {
        listen       54321;
        server_name  esb-socket;
        location / {
            proxy_pass http://esb-socket;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

要修改系统默认打开数限制否则worker_connections还是无效

echo "* soft nofile 65536" >> /etc/security/limits.conf
echo "* hard nofile 65536" >> /etc/security/limits.conf

9、配置keepalived

按照上面的安装方法,keepalived的配置文件在/etc/keepalived/keepalived.conf。

主、从服务器的配置相关联但有所不同。如下:

注意:配置文件中virtual_router_id参数一定不能用默认值,否则容易因为冲突导致虚IP起不来,建议配置前先查看(用此命令查看tcpdump -i any vrrp)网络中是否已有vrrp广播以及其使用的vrid

master:

! Configuration File for keepalived

global_defs {
   #报警邮箱参数删除,其他项保持默认配置
   notification_email {
   }
   router_id esb_socket_master
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

#配置nginx监控脚本(该配置一定要在vrrp_instance上面)
vrrp_script chk_http_port {
    #nginx监控脚本位置
    script "/etc/keepalived/nginx_check.sh"
    #脚本执行间隔
    interval 3
    #脚本结果导致的优先级变更:10表示优先级+10;-10则表示优先级-10
    weight 2
    }

vrrp_instance VI_1 {
    #主辅标志
    state MASTER
    #虚IP对应的真实网卡名称(注意:核对网卡名称)
    interface ens32
    virtual_router_id 51
    #设置本节点的优先级,优先级高的为master
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass abCD12#$
    }

#虚IP网卡名和地址(注意:核对网卡名称)
virtual_ipaddress {
        192.168.1.98/24 brd 192.168.1.255 dev ens32 label ens32:VIP
    }

#调用vrrp_script
track_script {
    chk_http_port
    }
}

bakcup1:

! Configuration File for keepalived

global_defs {
   #报警邮箱参数删除,其他项保持默认配置
   notification_email {
   }
   router_id esb_socket_backup1
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

#配置nginx监控脚本(该配置一定要在vrrp_instance上面)
vrrp_script chk_http_port {
    #nginx监控脚本位置
    script "/etc/keepalived/nginx_check.sh"
    #脚本执行间隔
    interval 3
    #脚本结果导致的优先级变更:10表示优先级+10;-10则表示优先级-10
    weight 2
    }

vrrp_instance VI_1 {
    #主辅标志
    state BACKUP
    #虚IP对应的真实网卡名称(注意:核对网卡名称)
    interface eth0
    virtual_router_id 51
    #设置本节点的优先级,优先级高的为master
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass abCD12#$
    }

#虚IP网卡名和地址(注意:核对网卡名称)
virtual_ipaddress {
    192.168.1.98/24 brd 192.168.1.255 dev eth0 label eth0:VIP
    }
    
#调用vrrp_script
track_script {
    chk_http_port
    }
}

backup2:

! Configuration File for keepalived

global_defs {
   #报警邮箱参数删除,其他项保持默认配置
   notification_email {
   }
   router_id esb_socket_backup2
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

#配置nginx监控脚本(该配置一定要在vrrp_instance上面)
vrrp_script chk_http_port {
    #nginx监控脚本位置
    script "/etc/keepalived/nginx_check.sh"
    #脚本执行间隔
    interval 3
    #脚本结果导致的优先级变更:10表示优先级+10;-10则表示优先级-10
    weight 2
    }

vrrp_instance VI_1 {
    #主辅标志
    state BACKUP
    #虚IP对应的真实网卡名称(注意:核对网卡名称)
    interface ens32
    virtual_router_id 51
    #设置本节点的优先级,优先级高的为master
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass abCD12#$
    }

#虚IP网卡名和地址(注意:核对网卡名称)
virtual_ipaddress {
    192.168.1.98/24 brd 192.168.1.255 dev ens32 label ens32:VIP
    }
    
#调用vrrp_script
track_script {
    chk_http_port
    }
}

验证:

先后在主、从服务器上启动keepalived: /etc/init.d/keepalived start

在主服务器上查看是否已经绑定了虚拟IP: ip addr

停止主服务器上的keepalived: /etc/init.d/keepalived stop

然后在从服务器上查看是否已经绑定了虚拟IP:

启动主服务器上的keepalived,看看主服务器能否重新接管虚拟IP

10、keepalived使用vrrp协议广播,防火墙要允许该协议

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 -p vrrp -j ACCEPT
firewall-cmd --reload

检查

firewall-cmd --direct --get-all-rules

11、让keepalived监控NginX的状态

经过前面的配置,如果主服务器的keepalived停止服务,从服务器会自动接管VIP对外服务;一旦主服务器的keepalived恢复,会重新接管VIP。

但这并不是我们需要的,我们需要的是当NginX停止服务的时候能够自动切换。

keepalived支持配置监控脚本,我们可以通过脚本监控NginX的状态,如果状态不正常则进行一系列的操作,最终仍不能恢复NginX则杀掉keepalived,使得从服务器能够接管服务。

如何监控NginX的状态

最简单的做法是监控NginX进程,更靠谱的做法是检查NginX端口,最靠谱的做法是检查多个url能否获取到页面。

如何尝试恢复服务

如果发现NginX不正常,重启之。等待3秒再次校验,仍然失败则不再尝试。

根据上述策略很容易写出监控脚本。这里使用nmap检查nginx端口来判断nginx的状态,记得要首先安装nmap。监控脚本如下:

#!/bin/sh
# check nginx server status
NGINX=/usr/local/nginx/sbin/nginx
PORT=54321

#检查nginx端口
nmap localhost -p $PORT | grep "$PORT/tcp open"
#echo $?
#如果nginx端口不通,尝试重启nginx,如果重启操作后依然不通,则停掉本机keepalived进程,虚IP会飘到备机。
if [ $? -ne 0 ];then
    $NGINX -s stop
    $NGINX
    sleep 2
    nmap localhost -p $PORT | grep "$PORT/tcp open"
    [ $? -ne 0 ] && /etc/init.d/keepalived stop
fi

脚本要有执行权限

chmod 755 nginx_check.sh

12、启动keepalived+nginx

systemctl start keepalived.service

常见问题

获取不到VIP

请检查virtual_router_id是否网络内有冲突,或更换virtual_router_id试试

可以抓包查看vrrp广播数据(查找vrid冲突的广播IP):tcpdump -i any vrrp

主备设备上VIP都起来了

检查步骤10是否正确执行

也可以tcpdump -i any vrrp查看是否主从都在广播,正常情况应该只有主的广播,从的不广播,一旦从的广播说明从的没收到主的广播所以自己开始广播。

虚拟IP正常配置,但是无法ping通虚IP

iptables -nl,检查INPUT项是否有drop

临时删除命令:iptables -D INPUT 1(1为行号,如果有多行,输入正确的行号)

去掉keepalived.conf的global_defs段中的vrrp_strict,重启nginx就不再自动添加该条规则

/var/log/message中报错Keepalived_vrrp[9681]: /etc/keepalived/nginx_check.sh exited due to signal 15

vrrp_script{}中的interval时间要大于脚本中的sleep时间

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值