Skip to content

centOS安装nginx+keepalivced

这里主要讲keepalived配置,nginx配置正常配。

nginx+keepalived需要两台才能体现出集群的高可用

安装nginx

yum命令安装(推荐)

#安装nginx
yum install -y nginx
#设置开机自启
systemctl enable nginx
#启动nginx
systemctl start nginx

安装包安装

安装工具和库

yum -y install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

下载并且解压

#下载包
wget  https://nginx.org/download/nginx-1.18.0.tar.gz
#解压
tar -zxvf nginx-1.18.0.tar.gz

编译并安装

#预编译
./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
#编译并且安装,可以分开执行
make && make install

启动nginx

进入安装路径下的sbin

./nginx
#(温和)此方式停止步骤是待nginx进程处理任务完毕进行停止。
./nginx -s quit:
#(强硬)此方式相当于先查出nginx进程id再使用kill命令强制杀掉进程。
./nginx -s stop:
#重启nginx(不推荐此方法,推荐先停止在启动)
./nginx -s reload

forbidden (13: Permission denied)

测试nginx发现出现上面报错需要关闭selinux:

#立即关闭--临时的,需要在下面修改配置永久关闭
setsebool -P httpd_can_network_connect 1
#设置开机也关闭
vi /etc/selinux/config
将selinux=enforcing改成selinux=disabled

安装keepalived

yum命令安装(推荐)

#安装keepalived
yum install -y keepalived
#设置开机自启
systemctl enable keepalived
#启动nginx
systemctl start keepalived

压缩包安装

依赖环境安装

yum install gcc
yum -y install openssl-devel
yum -y install libnl libnl-devel
yum -y install libnfnetlink-devel
yum -y install net-tools
yum -y install vim

下载并且解压包

#下载
wget https://www.keepalived.org/software/keepalived-2.0.20.tar.gz
tar -zxvf keepalived-2.0.20.tar.gz

编译并且安装

#预编译
./configure

如果出现一下错误,需要额外安装包

this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.
#安装插件
yum install -y libnl3.x86_64 libnl3-devel.x86_64

编译并且安装

make  && make install

配置启动

#复制配置文件到默认路径,具体源配置文件路径自行查看
mkdir /etc/keepalived
cp /usr/local/keepalived/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
#将keepalived启动脚本(源码目录下),放到/etc/init.d/目录下
cp /usr/local/keepalived/keepalived/etc/init.d/keepalived  /etc/rc.d/init.d/
#将keepalived启动脚本变量引用文件放到/etc/sysconfig/目录下:
cp /usr/local/keepalived/keepalived/etc/sysconfig/keepalived  /etc/sysconfig/
#将keepalived主程序加入到环境变量/usr/sbin/目录下:
cp /usr/local/sbin/keepalived  /usr/sbin/
#通过service启动
service keepalived start

keepalived配置

keepalived模式

这里讲一下keepalived的两种模式

  • 双主(推荐):两台nginx会平均分配流量请求,不分主从。一台挂了,另外一台就承担了所有流量

  • 主从:典型的主从节点,所有请求都从主节点请求,如果主节点挂了,从节点替代主节点。当主节点被环境则继续由主节点负责接收流量

检查nginx脚本

vi /etc/keepalived/nginx_check.sh

#!/bin/sh
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then  #如果nginx没在运行
   systemctl start nginx.service  #启动nginx
   sleep 2
   if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then  #如果无法启动
    killall keepalived  #杀死keepalived进程
   fi
fi

开放脚本权限

chmod a+x /etc/keepalived/nginx_check.sh

验证脚本是否有效

#关闭nginx
systemctl stop nginx.service
#启动脚本
sh /etc/keepalived/nginx_check.sh
#查看nginx是否被重启
systemctl status nginx.service

把下面脚本的内容去掉,重复上面的步骤看keepalived是否被关闭,被关闭则脚本没问题

systemctl start nginx.service  #启动nginx
sleep 2

注意事项

  • 执行脚本如果出现以下报错,主要是脚本里的格式问题

    /bin/sh^M: bad interpreter: No such file or directory

vi /etc/keepalived/nginx_check.sh

输入这个命令解决

:set ff=unix
  • 如果无法切换查看是否因为脚本用到了killall命令,最小化安装的centos没有,所以要安装一下

    yum -y install psmisc

双主配置

主要将yum下的配置,非yum安装的依葫芦画瓢。如果是双主就没有主从的概念

修改配置文件

vi /etc/keepalived/keepalived.conf

master配置

global_defs {
   # 定义管理员邮件地址,表示keepalived在发生诸如切换操作时需要发送email通知,以及email发送给哪些邮件地址,可以有多个,每行一个
   notification_email {
     #设置报警邮件地址,可以设置多个,每行一个。 需开启本机的sendmail服务
     563796085@qq.com
   }
   #keepalived在发生诸如切换操作时需要发送email通知地址,表示发送通知的邮件源地址是谁。类似发件人
   notification_email_from 563796085@qq.com
   #指定发送email的smtp服务器
   smtp_server smtp.qq.com
   #设置连接smtp server的超时时间
   smtp_connect_timeout 30
   #运行keepalived的机器的一个标识,通常可设为hostname。故障发生时,发邮件时显示在邮件主题中的信息。
   router_id nginx1
}

# 定义chk_nginx脚本,脚本执行间隔10秒,权重-5,检测nginx服务是否在运行。有很多方式,比如进程,用脚本检测等等
vrrp_script chk_nginx {
   #这里通过脚本监测
   script "/etc/keepalived/nginx_check.sh"
   #脚本执行间隔,每2s检测一次
   interval 2
   #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
   weight -5
   #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
   fall 2
   #检测1次成功就算成功。但不修改优先级
   rise 1
}

#定义vrrp实例,VI_1 为虚拟路由的标示符,自己定义名称,keepalived在同一virtual_router_id中priority(0-255)最大的会成为master,也就是接管VIP,当priority最大的主机发生故障后次priority将会接管
vrrp_instance VI_1 {
    #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器。注意这里的state指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,
    #但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,
    #那么他会就回抢占为MASTER
    state MASTER
    #指定HA监测网络的接口。与本机 IP 地址所在的网络接口相同,可通过ip addr 查看
    interface eth0
    #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
    virtual_router_id 51
    #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级
    priority 101
    #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
    advert_int 1
    #设置验证类型和密码。主从必须一样
    authentication {
        #设置vrrp验证类型,主要有PASS和AH两种
        auth_type PASS
        #设置vrrp验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
        auth_pass nginx111
    }
    #执行nginx检测脚本。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!!
    track_script {
        #引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。
        chk_nginx
    }
    #VRRP HA 虚拟地址 如果有多个VIP,继续换行填写
    #设置VIP,它随着state变化而增加删除,当state为master的时候就添加,当state为backup的时候则删除,由优先级决定
    virtual_ipaddress {
        172.10.0.10
    }
}
#定义vrrp实例,VI_2 为虚拟路由的标示符,自己定义名称,keepalived在同一virtual_router_id中priority(0-255)最大的会成为master,也就是接管VIP,当priority最大的主机发生故障后次priority将会接管
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass nginx111
    }

    track_script {
        chk_nginx
    }

    virtual_ipaddress {
        172.10.0.11
    }
}

slave配置

global_defs {
   # 定义管理员邮件地址,表示keepalived在发生诸如切换操作时需要发送email通知,以及email发送给哪些邮件地址,可以有多个,每行一个
   notification_email {
     #设置报警邮件地址,可以设置多个,每行一个。 需开启本机的sendmail服务
     563796085@qq.com
   }
   #keepalived在发生诸如切换操作时需要发送email通知地址,表示发送通知的邮件源地址是谁。类似发件人
   notification_email_from 563796085@qq.com
   #指定发送email的smtp服务器
   smtp_server smtp.qq.com
   #设置连接smtp server的超时时间
   smtp_connect_timeout 30
   #运行keepalived的机器的一个标识,通常可设为hostname。故障发生时,发邮件时显示在邮件主题中的信息。
   router_id nginx1
}

vrrp_script check_nginx {
   #这里通过脚本监测
   script "/etc/keepalived/nginx_check.sh"
   interval 2
   weight -5
   fall 2
   #检测1次成功就算成功。但不修改优先级
   rise 1
}

vrrp_instance VI_1 {
    state BACKUP
    #网卡地址
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        #设置vrrp验证类型,主要有PASS和AH两种
        auth_type PASS
        #设置vrrp验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
        auth_pass nginx111
    }
    #执行nginx检测脚本。
    track_script {
        check_nginx
    }

    virtual_ipaddress {
        172.10.0.10
    }
}
vrrp_instance VI_2 {
    state MASTER
    #网卡地址
    interface eth0
    virtual_router_id 52
    priority 101
    advert_int 1
    authentication {
        #设置vrrp验证类型,主要有PASS和AH两种
        auth_type PASS
        #设置vrrp验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
        auth_pass nginx111
    }
    #执行nginx检测脚本。
    track_script {
        check_nginx
    }

    virtual_ipaddress {
        172.10.0.11
    }
}